X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fresource.c;h=ae890c4ee118ff305e547072aca6417c87561331;hb=beaa348e008d960e42548893d6b85fc7e59593c6;hp=5e2b79a00fb645c81ea9a96387fa4305df2c8cb9;hpb=fee7f059d72a04b1b07e20aea1c11d4064a9a23c;p=vlc diff --git a/src/input/resource.c b/src/input/resource.c index 5e2b79a00f..ae890c4ee1 100644 --- a/src/input/resource.c +++ b/src/input/resource.c @@ -28,6 +28,8 @@ # include "config.h" #endif +#include + #include #include #include @@ -51,7 +53,6 @@ struct input_resource_t sout_instance_t *p_sout; vout_thread_t *p_vout_free; - aout_instance_t *p_aout; /* This lock is used to protect vout resources access (for hold) * It is a special case because of embed video (possible deadlock @@ -61,8 +62,11 @@ struct input_resource_t /* You need lock+lock_hold to write to the following variables and * only lock or lock_hold to read them */ + int i_vout; vout_thread_t **pp_vout; + + aout_instance_t *p_aout; }; /* */ @@ -150,6 +154,7 @@ static void DestroyVout( input_resource_t *p_resource ) } static vout_thread_t *DetachVout( input_resource_t *p_resource ) { + vlc_assert_locked( &p_resource->lock ); assert( p_resource->i_vout == 0 ); vout_thread_t *p_vout = p_resource->p_vout_free; p_resource->p_vout_free = NULL; @@ -203,6 +208,8 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource, vout_thread_t *p_vout, video_format_t *p_fmt, bool b_recycle ) { + vlc_assert_locked( &p_resource->lock ); + if( !p_vout && !p_fmt ) { if( p_resource->p_vout_free ) @@ -275,21 +282,20 @@ static vout_thread_t *RequestVout( input_resource_t *p_resource, } static vout_thread_t *HoldVout( input_resource_t *p_resource ) { - if( p_resource->i_vout <= 0 ) - return NULL; - /* TODO FIXME: p_resource->pp_vout order is NOT stable */ vlc_mutex_lock( &p_resource->lock_hold ); - vout_thread_t *p_vout = p_resource->pp_vout[0]; - - vlc_object_hold( p_vout ); + vout_thread_t *p_vout = p_resource->i_vout > 0 ? p_resource->pp_vout[0] : NULL; + if( p_vout ) + vlc_object_hold( p_vout ); vlc_mutex_unlock( &p_resource->lock_hold ); return p_vout; } -static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, int *pi_vout ) + +static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, + size_t *pi_vout ) { vout_thread_t **pp_vout; @@ -301,7 +307,7 @@ static void HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, if( p_resource->i_vout <= 0 ) goto exit; - pp_vout = calloc( p_resource->i_vout, sizeof(*pp_vout) ); + pp_vout = malloc( p_resource->i_vout * sizeof(*pp_vout) ); if( !pp_vout ) goto exit; @@ -327,14 +333,20 @@ static void DestroyAout( input_resource_t *p_resource ) } static aout_instance_t *DetachAout( input_resource_t *p_resource ) { + vlc_assert_locked( &p_resource->lock ); + vlc_mutex_lock( &p_resource->lock_hold ); + aout_instance_t *p_aout = p_resource->p_aout; p_resource->p_aout = NULL; + vlc_mutex_unlock( &p_resource->lock_hold ); + return p_aout; } static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance_t *p_aout ) { + vlc_assert_locked( &p_resource->lock ); assert( p_resource->p_input ); if( p_aout ) @@ -345,33 +357,39 @@ static aout_instance_t *RequestAout( input_resource_t *p_resource, aout_instance } else { - if( !p_resource->p_aout ) + p_aout = p_resource->p_aout; + if( !p_aout ) { msg_Dbg( p_resource->p_input, "creating aout" ); - p_resource->p_aout = aout_New( p_resource->p_input ); + p_aout = aout_New( p_resource->p_input ); + + vlc_mutex_lock( &p_resource->lock_hold ); + p_resource->p_aout = p_aout; + vlc_mutex_unlock( &p_resource->lock_hold ); } else { msg_Dbg( p_resource->p_input, "reusing aout" ); } - if( !p_resource->p_aout ) + if( !p_aout ) return NULL; - vlc_object_detach( p_resource->p_aout ); - vlc_object_attach( p_resource->p_aout, p_resource->p_input ); - vlc_object_hold( p_resource->p_aout ); - return p_resource->p_aout; + vlc_object_detach( p_aout ); + vlc_object_attach( p_aout, p_resource->p_input ); + vlc_object_hold( p_aout ); + return p_aout; } } static aout_instance_t *HoldAout( input_resource_t *p_resource ) { - if( !p_resource->p_aout ) - return NULL; + vlc_mutex_lock( &p_resource->lock_hold ); aout_instance_t *p_aout = p_resource->p_aout; + if( p_aout ) + vlc_object_hold( p_aout ); - vlc_object_hold( p_aout ); + vlc_mutex_unlock( &p_resource->lock_hold ); return p_aout; } @@ -451,10 +469,13 @@ vout_thread_t *input_resource_HoldVout( input_resource_t *p_resource ) { return HoldVout( p_resource ); } -void input_resource_HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, int *pi_vout ) + +void input_resource_HoldVouts( input_resource_t *p_resource, vout_thread_t ***ppp_vout, + size_t *pi_vout ) { HoldVouts( p_resource, ppp_vout, pi_vout ); } + void input_resource_TerminateVout( input_resource_t *p_resource ) { input_resource_RequestVout( p_resource, NULL, NULL, false ); @@ -480,11 +501,7 @@ aout_instance_t *input_resource_RequestAout( input_resource_t *p_resource, aout_ } aout_instance_t *input_resource_HoldAout( input_resource_t *p_resource ) { - vlc_mutex_lock( &p_resource->lock ); - aout_instance_t *p_ret = HoldAout( p_resource ); - vlc_mutex_unlock( &p_resource->lock ); - - return p_ret; + return HoldAout( p_resource ); } /* */ sout_instance_t *input_resource_RequestSout( input_resource_t *p_resource, sout_instance_t *p_sout, const char *psz_sout )