Commit 4b7cff4d authored by Laurent Aimar's avatar Laurent Aimar

* libvlc: removed some unused options.

           added sout-keep option to keep sout instance across playlist
           items (usefull with 'gather' stream_out)
 * stream_output : implement the sout-keep mode.
 * playlist, video_output, stream_output: vout and sout are now reattached
 to playlist instead of being destroyed. There are automatically destroy
 if unused byt the new input (200 ms after access and demuxer have finished
 their inittialisation step.)
parent 0041c1c4
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* libvlc.h: main libvlc header * libvlc.h: main libvlc header
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2002 VideoLAN * Copyright (C) 1998-2002 VideoLAN
* $Id: libvlc.h,v 1.83 2003/08/28 21:11:54 gbazin Exp $ * $Id: libvlc.h,v 1.84 2003/09/07 22:43:17 fenrir Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -26,11 +26,6 @@ ...@@ -26,11 +26,6 @@
#define Nothing here, this is just to prevent update-po from being stupid #define Nothing here, this is just to prevent update-po from being stupid
#include "vlc_keys.h" #include "vlc_keys.h"
static char *ppsz_sout_acodec[] = { "", "mpga", "mp3", "vorb", "a52", NULL };
static char *ppsz_sout_vcodec[] = { "", "mpgv", "mp4v", "DIV1", "DIV2",
"DIV3", "h263", "i263", "WMV1", "WMV2",
"MJPG", NULL };
static char *ppsz_language[] = { "auto", "en", "en_GB", "de", "fr", "it", "ja", static char *ppsz_language[] = { "auto", "en", "en_GB", "de", "fr", "it", "ja",
"nl", "no", "pl", "pt_BR", "ru", "sv", NULL }; "nl", "no", "pl", "pt_BR", "ru", "sv", NULL };
...@@ -324,26 +319,16 @@ static char *ppsz_language[] = { "auto", "en", "en_GB", "de", "fr", "it", "ja", ...@@ -324,26 +319,16 @@ static char *ppsz_language[] = { "auto", "en", "en_GB", "de", "fr", "it", "ja",
"This allows you to choose if the video stream should be redirected to " \ "This allows you to choose if the video stream should be redirected to " \
"the stream output facility when this last one is enabled.") "the stream output facility when this last one is enabled.")
#define SOUT_VCODEC_TEXT N_("Video encoding codec" )
#define SOUT_VCODEC_LONGTEXT N_( \
"This allows you to force video encoding")
#define SOUT_VBITRATE_TEXT N_("Video bitrate encoding (kB/s)" )
#define SOUT_VBITRATE_LONGTEXT N_( \
"This allows you to specify video bitrate in kB/s.")
#define SOUT_AUDIO_TEXT N_("Enable audio stream output") #define SOUT_AUDIO_TEXT N_("Enable audio stream output")
#define SOUT_AUDIO_LONGTEXT N_( \ #define SOUT_AUDIO_LONGTEXT N_( \
"This allows you to choose if the video stream should be redirected to " \ "This allows you to choose if the video stream should be redirected to " \
"the stream output facility when this last one is enabled.") "the stream output facility when this last one is enabled.")
#define SOUT_ACODEC_TEXT N_("Audio encoding codec" ) #define SOUT_KEEP_TEXT N_("Keep sout open" )
#define SOUT_ACODEC_LONGTEXT N_( \ #define SOUT_KEEP_LONGTEXT N_( \
"This allows you to force audio encoding") "This allows you to keep an unique sout instance across " \
"multiple playlist item (automatically insert gather stream_out " \
#define SOUT_ABITRATE_TEXT N_("Audio bitrate encoding (kB/s)" ) "if not specified)" )
#define SOUT_ABITRATE_LONGTEXT N_( \
"This allows you to specify audio bitrate in kB/s.")
#define PACKETIZER_TEXT N_("Choose preferred packetizer list") #define PACKETIZER_TEXT N_("Choose preferred packetizer list")
#define PACKETIZER_LONGTEXT N_( \ #define PACKETIZER_LONGTEXT N_( \
...@@ -588,24 +573,15 @@ vlc_module_begin(); ...@@ -588,24 +573,15 @@ vlc_module_begin();
add_category_hint( N_("Decoders"), NULL, VLC_TRUE ); add_category_hint( N_("Decoders"), NULL, VLC_TRUE );
add_module( "codec", "decoder", NULL, NULL, CODEC_TEXT, CODEC_LONGTEXT, VLC_TRUE ); add_module( "codec", "decoder", NULL, NULL, CODEC_TEXT, CODEC_LONGTEXT, VLC_TRUE );
#if 0 // Encoders have been disabled for now as we are using the stream output transcoder instead
add_category_hint( N_("Encoders"), NULL, VLC_TRUE );
add_module( "video-encoder", "video encoder", NULL, NULL, ENCODER_VIDEO_TEXT, ENCODER_VIDEO_LONGTEXT, VLC_TRUE );
add_module( "audio-encoder", "audio encoder", NULL, NULL, ENCODER_AUDIO_TEXT, ENCODER_AUDIO_LONGTEXT, VLC_TRUE );
#endif
/* Stream output options */ /* Stream output options */
add_category_hint( N_("Stream output"), NULL, VLC_TRUE ); add_category_hint( N_("Stream output"), NULL, VLC_TRUE );
add_string( "sout", NULL, NULL, SOUT_TEXT, SOUT_LONGTEXT, VLC_TRUE ); add_string( "sout", NULL, NULL, SOUT_TEXT, SOUT_LONGTEXT, VLC_TRUE );
add_bool( "sout-display", VLC_FALSE, NULL, SOUT_DISPLAY_TEXT, SOUT_DISPLAY_LONGTEXT, VLC_TRUE ); add_bool( "sout-display", VLC_FALSE, NULL, SOUT_DISPLAY_TEXT, SOUT_DISPLAY_LONGTEXT, VLC_TRUE );
add_bool( "sout-keep", VLC_FALSE, NULL, SOUT_KEEP_TEXT, SOUT_KEEP_LONGTEXT, VLC_TRUE );
add_bool( "sout-audio", 1, NULL, SOUT_AUDIO_TEXT, SOUT_AUDIO_LONGTEXT, VLC_TRUE ); add_bool( "sout-audio", 1, NULL, SOUT_AUDIO_TEXT, SOUT_AUDIO_LONGTEXT, VLC_TRUE );
add_string_from_list( "sout-acodec", "", ppsz_sout_acodec, NULL, SOUT_ACODEC_TEXT, SOUT_ACODEC_LONGTEXT, VLC_TRUE );
add_bool( "sout-abitrate", 0, NULL, SOUT_ABITRATE_TEXT, SOUT_ABITRATE_LONGTEXT, VLC_TRUE );
add_bool( "sout-video", 1, NULL, SOUT_VIDEO_TEXT, SOUT_VIDEO_LONGTEXT, VLC_TRUE ); add_bool( "sout-video", 1, NULL, SOUT_VIDEO_TEXT, SOUT_VIDEO_LONGTEXT, VLC_TRUE );
add_string_from_list( "sout-vcodec", "", ppsz_sout_vcodec, NULL, SOUT_VCODEC_TEXT, SOUT_VCODEC_LONGTEXT, VLC_TRUE );
add_bool( "sout-vbitrate", 0, NULL, SOUT_VBITRATE_TEXT, SOUT_VBITRATE_LONGTEXT, VLC_TRUE );
add_module( "packetizer", "packetizer", NULL, NULL, add_module( "packetizer", "packetizer", NULL, NULL,
PACKETIZER_TEXT, PACKETIZER_LONGTEXT, VLC_TRUE ); PACKETIZER_TEXT, PACKETIZER_LONGTEXT, VLC_TRUE );
...@@ -614,6 +590,7 @@ vlc_module_begin(); ...@@ -614,6 +590,7 @@ vlc_module_begin();
ACCESS_OUTPUT_TEXT, ACCESS_OUTPUT_LONGTEXT, VLC_TRUE ); ACCESS_OUTPUT_TEXT, ACCESS_OUTPUT_LONGTEXT, VLC_TRUE );
add_integer( "ttl", 1, NULL, TTL_TEXT, TTL_LONGTEXT, VLC_TRUE ); add_integer( "ttl", 1, NULL, TTL_TEXT, TTL_LONGTEXT, VLC_TRUE );
/* CPU options */ /* CPU options */
add_category_hint( N_("CPU"), NULL, VLC_TRUE ); add_category_hint( N_("CPU"), NULL, VLC_TRUE );
#if defined( __i386__ ) #if defined( __i386__ )
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* playlist.c : Playlist management functions * playlist.c : Playlist management functions
***************************************************************************** *****************************************************************************
* Copyright (C) 1999-2001 VideoLAN * Copyright (C) 1999-2001 VideoLAN
* $Id: playlist.c,v 1.47 2003/08/28 15:59:04 gbazin Exp $ * $Id: playlist.c,v 1.48 2003/09/07 22:43:17 fenrir Exp $
* *
* Authors: Samuel Hocevar <sam@zoy.org> * Authors: Samuel Hocevar <sam@zoy.org>
* *
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <string.h> /* strerror() */ #include <string.h> /* strerror() */
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/sout.h>
#include "stream_control.h" #include "stream_control.h"
#include "input_ext-intf.h" #include "input_ext-intf.h"
...@@ -507,11 +509,63 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos) ...@@ -507,11 +509,63 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos)
} }
/* Following functions are local */ /* Following functions are local */
static void ObjectGarbageCollector( playlist_t *p_playlist,
int i_type,
vlc_bool_t *pb_obj_destroyed,
mtime_t *pi_obj_destroyed_date )
{
vlc_object_t *p_obj;
if( *pb_obj_destroyed || *pi_obj_destroyed_date > mdate() )
{
return;
}
if( *pi_obj_destroyed_date == 0 )
{
/* give a little time */
*pi_obj_destroyed_date = mdate() + 300000LL;
}
else
{
while( ( p_obj = vlc_object_find( p_playlist,
i_type,
FIND_CHILD ) ) )
{
if( p_obj->p_parent != (vlc_object_t*)p_playlist )
{
/* only first chiled (ie unused) */
vlc_object_release( p_obj );
break;
}
if( i_type == VLC_OBJECT_VOUT )
{
msg_Dbg( p_playlist, "vout garbage collector destroying 1 vout" );
vlc_object_detach( p_obj );
vlc_object_release( p_obj );
vout_Destroy( (vout_thread_t *)p_obj );
}
else if( i_type == VLC_OBJECT_SOUT )
{
vlc_object_release( p_obj );
sout_DeleteInstance( (sout_instance_t*)p_obj );
}
}
*pb_obj_destroyed = VLC_TRUE;
}
}
/***************************************************************************** /*****************************************************************************
* RunThread: main playlist thread * RunThread: main playlist thread
*****************************************************************************/ *****************************************************************************/
static void RunThread ( playlist_t *p_playlist ) static void RunThread ( playlist_t *p_playlist )
{ {
vlc_object_t *p_obj;
vlc_bool_t b_vout_destroyed = VLC_FALSE; /*we do vout garbage collector */
mtime_t i_vout_destroyed_date = 0;
vlc_bool_t b_sout_destroyed = VLC_FALSE; /*we do vout garbage collector */
mtime_t i_sout_destroyed_date = 0;
/* Tell above that we're ready */ /* Tell above that we're ready */
vlc_thread_ready( p_playlist ); vlc_thread_ready( p_playlist );
...@@ -527,10 +581,8 @@ static void RunThread ( playlist_t *p_playlist ) ...@@ -527,10 +581,8 @@ static void RunThread ( playlist_t *p_playlist )
{ {
input_thread_t *p_input; input_thread_t *p_input;
/* Unlink current input */
p_input = p_playlist->p_input; p_input = p_playlist->p_input;
p_playlist->p_input = NULL; p_playlist->p_input = NULL;
vlc_object_detach( p_input );
/* Release the playlist lock, because we may get stuck /* Release the playlist lock, because we may get stuck
* in input_DestroyThread() for some time. */ * in input_DestroyThread() for some time. */
...@@ -538,7 +590,17 @@ static void RunThread ( playlist_t *p_playlist ) ...@@ -538,7 +590,17 @@ static void RunThread ( playlist_t *p_playlist )
/* Destroy input */ /* Destroy input */
input_DestroyThread( p_input ); input_DestroyThread( p_input );
/* Unlink current input (_after_ input_DestroyThread for vout garbage collector)*/
vlc_object_detach( p_input );
/* Destroy object */
vlc_object_destroy( p_input ); vlc_object_destroy( p_input );
b_vout_destroyed = VLC_FALSE;
i_vout_destroyed_date = 0;
b_sout_destroyed = VLC_FALSE;
i_sout_destroyed_date = 0;
continue; continue;
} }
/* This input is dying, let him do */ /* This input is dying, let him do */
...@@ -567,13 +629,27 @@ static void RunThread ( playlist_t *p_playlist ) ...@@ -567,13 +629,27 @@ static void RunThread ( playlist_t *p_playlist )
input_StopThread( p_playlist->p_input ); input_StopThread( p_playlist->p_input );
continue; continue;
} }
else if( p_playlist->p_input->stream.control.i_status != INIT_S )
{
ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT,
&b_vout_destroyed, &i_vout_destroyed_date );
ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT,
&b_sout_destroyed, &i_sout_destroyed_date );
}
} }
else if( p_playlist->i_status != PLAYLIST_STOPPED ) else if( p_playlist->i_status != PLAYLIST_STOPPED )
{ {
SkipItem( p_playlist, 0 ); SkipItem( p_playlist, 0 );
PlayItem( p_playlist ); PlayItem( p_playlist );
} }
else if( p_playlist->i_status == PLAYLIST_STOPPED )
{
ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT,
&b_vout_destroyed, &i_vout_destroyed_date );
ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT,
&b_sout_destroyed, &i_sout_destroyed_date );
}
vlc_mutex_unlock( &p_playlist->object_lock ); vlc_mutex_unlock( &p_playlist->object_lock );
msleep( INTF_IDLE_SLEEP ); msleep( INTF_IDLE_SLEEP );
...@@ -625,6 +701,22 @@ static void RunThread ( playlist_t *p_playlist ) ...@@ -625,6 +701,22 @@ static void RunThread ( playlist_t *p_playlist )
msleep( INTF_IDLE_SLEEP ); msleep( INTF_IDLE_SLEEP );
} }
/* close all remaining vout */
while( ( p_obj = vlc_object_find( p_playlist,
VLC_OBJECT_VOUT, FIND_CHILD ) ) )
{
vlc_object_detach( p_obj );
vlc_object_release( p_obj );
vout_Destroy( (vout_thread_t *)p_obj );
}
/* close all remaining sout */
while( ( p_obj = vlc_object_find( p_playlist,
VLC_OBJECT_SOUT, FIND_CHILD ) ) )
{
vlc_object_release( p_obj );
sout_DeleteInstance( (sout_instance_t*)p_obj );
}
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* stream_output.c : stream output module * stream_output.c : stream output module
***************************************************************************** *****************************************************************************
* Copyright (C) 2002 VideoLAN * Copyright (C) 2002 VideoLAN
* $Id: stream_output.c,v 1.33 2003/08/09 14:59:24 gbazin Exp $ * $Id: stream_output.c,v 1.34 2003/09/07 22:43:17 fenrir Exp $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir@via.ecp.fr> * Laurent Aimar <fenrir@via.ecp.fr>
...@@ -73,6 +73,42 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent, ...@@ -73,6 +73,42 @@ sout_instance_t * __sout_NewInstance ( vlc_object_t *p_parent,
char * psz_dest ) char * psz_dest )
{ {
sout_instance_t *p_sout; sout_instance_t *p_sout;
vlc_value_t keep;
if( var_Get( p_parent, "sout-keep", &keep ) < 0 )
{
msg_Warn( p_parent, "cannot get sout-keep value" );
keep.b_bool = VLC_FALSE;
}
else if( keep.b_bool )
{
msg_Warn( p_parent, "sout-keep true" );
if( ( p_sout = vlc_object_find( p_parent, VLC_OBJECT_SOUT, FIND_ANYWHERE ) ) )
{
if( !strcmp( p_sout->psz_sout, psz_dest ) )
{
msg_Warn( p_parent, "sout keep : reusing sout" );
msg_Warn( p_parent, "sout keep : you probably want to use gather stream_out" );
vlc_object_detach( p_sout );
vlc_object_attach( p_sout, p_parent );
vlc_object_release( p_sout );
return p_sout;
}
else
{
msg_Warn( p_parent, "sout keep : destroying unusable sout" );
sout_DeleteInstance( p_sout );
}
}
}
else if( !keep.b_bool )
{
while( ( p_sout = vlc_object_find( p_parent, VLC_OBJECT_SOUT, FIND_PARENT ) ) )
{
msg_Warn( p_parent, "sout keep : destroying old sout" );
sout_DeleteInstance( p_sout );
}
}
/* *** Allocate descriptor *** */ /* *** Allocate descriptor *** */
p_sout = vlc_object_create( p_parent, VLC_OBJECT_SOUT ); p_sout = vlc_object_create( p_parent, VLC_OBJECT_SOUT );
...@@ -144,25 +180,12 @@ sout_packetizer_input_t *__sout_InputNew( vlc_object_t *p_this, ...@@ -144,25 +180,12 @@ sout_packetizer_input_t *__sout_InputNew( vlc_object_t *p_this,
sout_instance_t *p_sout = NULL; sout_instance_t *p_sout = NULL;
sout_packetizer_input_t *p_input; sout_packetizer_input_t *p_input;
int i_try;
/* search an stream output */ /* search an stream output */
for( i_try = 0; i_try < 12; i_try++ ) if( !( p_sout = vlc_object_find( p_this, VLC_OBJECT_SOUT, FIND_ANYWHERE ) ) )
{
p_sout = vlc_object_find( p_this, VLC_OBJECT_SOUT, FIND_ANYWHERE );
if( p_sout )
{
break;
}
msleep( 100*1000 );
msg_Dbg( p_this, "waiting for sout" );
}
if( !p_sout )
{ {
/* can't happen ... */
msg_Err( p_this, "cannot find any stream ouput" ); msg_Err( p_this, "cannot find any stream ouput" );
return( NULL ); return NULL;
} }
msg_Dbg( p_sout, "adding a new input" ); msg_Dbg( p_sout, "adding a new input" );
...@@ -1200,60 +1223,22 @@ static char *_sout_stream_url_to_chain( vlc_object_t *p_this, char *psz_url ) ...@@ -1200,60 +1223,22 @@ static char *_sout_stream_url_to_chain( vlc_object_t *p_this, char *psz_url )
{ {
mrl_t mrl; mrl_t mrl;
char *psz_chain, *p; char *psz_chain, *p;
char *psz_vcodec, *psz_acodec;
mrl_Parse( &mrl, psz_url ); mrl_Parse( &mrl, psz_url );
p = psz_chain = malloc( 500 + strlen( mrl.psz_way ) + strlen( mrl.psz_access ) + strlen( mrl.psz_name ) ); p = psz_chain = malloc( 500 + strlen( mrl.psz_way ) +
strlen( mrl.psz_access ) +
psz_vcodec = config_GetPsz( p_this, "sout-vcodec" ); strlen( mrl.psz_name ) );
if( psz_vcodec && *psz_vcodec == '\0')
{
FREE( psz_vcodec );
}
psz_acodec = config_GetPsz( p_this, "sout-acodec" );
if( psz_acodec && *psz_acodec == '\0' )
{
FREE( psz_acodec );
}
/* set transcoding */
if( psz_vcodec || psz_acodec )
{
p += sprintf( p, "transcode{" );
if( psz_vcodec )
{
int br;
p += sprintf( p, "vcodec=%s,", psz_vcodec );
if( ( br = config_GetInt( p_this, "sout-vbitrate" ) ) > 0 )
{
p += sprintf( p, "vb=%d,", br * 1000 );
}
free( psz_vcodec );
}
if( psz_acodec )
{
int br;
p += sprintf( p, "acodec=%s,", psz_acodec );
if( ( br = config_GetInt( p_this, "sout-abitrate" ) ) > 0 )
{
p += sprintf( p, "ab=%d,", br * 1000 );
}
free( psz_acodec );
}
p += sprintf( p, "}:" );
}
if( config_GetInt( p_this, "sout-display" ) ) if( config_GetInt( p_this, "sout-display" ) )
{ {
p += sprintf( p, "duplicate{dst=display,dst=std{mux=\"%s\",access=\"%s\",url=\"%s\"}}", mrl.psz_way, mrl.psz_access, mrl.psz_name ); p += sprintf( p, "duplicate{dst=display,dst=std{mux=\"%s\",access=\"%s\",url=\"%s\"}}",
mrl.psz_way, mrl.psz_access, mrl.psz_name );
} }
else else
{ {
p += sprintf( p, "std{mux=\"%s\",access=\"%s\",url=\"%s\"}", mrl.psz_way, mrl.psz_access, mrl.psz_name ); p += sprintf( p, "std{mux=\"%s\",access=\"%s\",url=\"%s\"}",
mrl.psz_way, mrl.psz_access, mrl.psz_name );
} }
mrl_Clean( &mrl ); mrl_Clean( &mrl );
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* thread, and destroy a previously oppened video output thread. * thread, and destroy a previously oppened video output thread.
***************************************************************************** *****************************************************************************
* Copyright (C) 2000-2001 VideoLAN * Copyright (C) 2000-2001 VideoLAN
* $Id: video_output.c,v 1.232 2003/08/28 21:11:54 gbazin Exp $ * $Id: video_output.c,v 1.233 2003/09/07 22:43:17 fenrir Exp $
* *
* Authors: Vincent Seguin <seguin@via.ecp.fr> * Authors: Vincent Seguin <seguin@via.ecp.fr>
* *
...@@ -78,21 +78,21 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, ...@@ -78,21 +78,21 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout,
/* Reattach video output to input before bailing out */ /* Reattach video output to input before bailing out */
if( p_vout ) if( p_vout )
{ {
vlc_object_t *p_input; vlc_object_t *p_playlist;
p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_PARENT ); p_playlist = vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_input ) if( p_playlist )
{ {
vlc_object_detach( p_vout ); vlc_object_detach( p_vout );
vlc_object_attach( p_vout, p_input ); vlc_object_attach( p_vout, p_playlist );
vlc_object_release( p_input ); vlc_object_release( p_playlist );
} }
else else
{ {
msg_Dbg( p_this, "cannot find playlist destroying vout" );
vlc_object_detach( p_vout ); vlc_object_detach( p_vout );
/* vlc_object_release( p_vout ); */
vout_Destroy( p_vout ); vout_Destroy( p_vout );
} }
} }
...@@ -110,20 +110,21 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout, ...@@ -110,20 +110,21 @@ vout_thread_t * __vout_Request ( vlc_object_t *p_this, vout_thread_t *p_vout,
if( !p_vout ) if( !p_vout )
{ {
vlc_object_t *p_input; vlc_object_t *p_playlist;
p_input = vlc_object_find( p_this, VLC_OBJECT_INPUT, FIND_PARENT ); p_playlist = vlc_object_find( p_this,
if( p_input ) VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
if( p_playlist )
{ {
p_vout = vlc_object_find( p_input, VLC_OBJECT_VOUT, p_vout = vlc_object_find( p_playlist,
FIND_CHILD ); VLC_OBJECT_VOUT, FIND_CHILD );
/* only first children of p_input for unused vout */ /* only first children of p_input for unused vout */
if( p_vout && p_vout->p_parent != p_input ) if( p_vout && p_vout->p_parent != p_playlist )
{ {
vlc_object_release( p_vout ); vlc_object_release( p_vout );
p_vout = NULL; p_vout = NULL;
} }
vlc_object_release( p_input ); vlc_object_release( p_playlist );
} }
} }
} }
...@@ -970,11 +971,14 @@ static void RunThread( vout_thread_t *p_vout) ...@@ -970,11 +971,14 @@ static void RunThread( vout_thread_t *p_vout)
} }
/* Need to reinitialise the chroma plugin */ /* Need to reinitialise the chroma plugin */
if( p_vout->chroma.p_module )
{
if( p_vout->chroma.p_module->pf_deactivate ) 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_deactivate( VLC_OBJECT(p_vout) );
p_vout->chroma.p_module->pf_activate( VLC_OBJECT(p_vout) ); p_vout->chroma.p_module->pf_activate( VLC_OBJECT(p_vout) );
} }
} }
}
/* /*
* Error loop - wait until the thread destruction is requested * Error loop - wait until the thread destruction is requested
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment