X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Fbridge.c;h=365140bab28223fe78dbe239242b052dff39b3c4;hb=2a98d120084ee14a08b6d3267c8c9eee8ab3648e;hp=d329f834dc61d286dc5318bc0d1d3c219fc77bd9;hpb=05492281965ed211badf7e1f4c2220be720d3356;p=vlc diff --git a/modules/stream_out/bridge.c b/modules/stream_out/bridge.c index d329f834dc..365140bab2 100644 --- a/modules/stream_out/bridge.c +++ b/modules/stream_out/bridge.c @@ -98,10 +98,10 @@ vlc_module_begin () /* Only usable with VLM. No category so not in gui preferences set_category( CAT_SOUT ) set_subcategory( SUBCAT_SOUT_STREAM )*/ - add_integer( SOUT_CFG_PREFIX_OUT "id", 0, NULL, ID_TEXT, ID_LONGTEXT, - false ); - add_string( SOUT_CFG_PREFIX_OUT "in-name", "default", NULL, - DEST_TEXT, DEST_LONGTEXT, false ); + add_integer( SOUT_CFG_PREFIX_OUT "id", 0, ID_TEXT, ID_LONGTEXT, + false ) + add_string( SOUT_CFG_PREFIX_OUT "in-name", "default", + DEST_TEXT, DEST_LONGTEXT, false ) set_callbacks( OpenOut, CloseOut ) add_submodule () @@ -110,18 +110,18 @@ vlc_module_begin () add_shortcut( "bridge-in" ) /*set_category( CAT_SOUT ) set_subcategory( SUBCAT_SOUT_STREAM )*/ - add_integer( SOUT_CFG_PREFIX_IN "delay", 0, NULL, DELAY_TEXT, - DELAY_LONGTEXT, false ); - add_integer( SOUT_CFG_PREFIX_IN "id-offset", 8192, NULL, ID_OFFSET_TEXT, - ID_OFFSET_LONGTEXT, false ); - add_string( SOUT_CFG_PREFIX_IN "name", "default", NULL, - NAME_TEXT, NAME_LONGTEXT, false ); - add_bool( SOUT_CFG_PREFIX_IN "placeholder", false, NULL, - PLACEHOLDER_TEXT, PLACEHOLDER_LONGTEXT, false ); - add_integer( SOUT_CFG_PREFIX_IN "placeholder-delay", 200, NULL, - PLACEHOLDER_DELAY_TEXT, PLACEHOLDER_DELAY_LONGTEXT, false ); - add_bool( SOUT_CFG_PREFIX_IN "placeholder-switch-on-iframe", true, NULL, - PLACEHOLDER_IFRAME_TEXT, PLACEHOLDER_IFRAME_LONGTEXT, false ); + add_integer( SOUT_CFG_PREFIX_IN "delay", 0, DELAY_TEXT, + DELAY_LONGTEXT, false ) + add_integer( SOUT_CFG_PREFIX_IN "id-offset", 8192, ID_OFFSET_TEXT, + ID_OFFSET_LONGTEXT, false ) + add_string( SOUT_CFG_PREFIX_IN "name", "default", + NAME_TEXT, NAME_LONGTEXT, false ) + add_bool( SOUT_CFG_PREFIX_IN "placeholder", false, + PLACEHOLDER_TEXT, PLACEHOLDER_LONGTEXT, false ) + add_integer( SOUT_CFG_PREFIX_IN "placeholder-delay", 200, + PLACEHOLDER_DELAY_TEXT, PLACEHOLDER_DELAY_LONGTEXT, false ) + add_bool( SOUT_CFG_PREFIX_IN "placeholder-switch-on-iframe", true, + PLACEHOLDER_IFRAME_TEXT, PLACEHOLDER_IFRAME_LONGTEXT, false ) set_callbacks( OpenIn, CloseIn ) vlc_module_end () @@ -167,24 +167,6 @@ typedef struct bridge_t int i_es_num; } bridge_t; -#define GetBridge(a,b) __GetBridge( VLC_OBJECT(a), b ) -static bridge_t *__GetBridge( vlc_object_t *p_object, const char *psz_name ) -{ - bridge_t *p_bridge; - vlc_value_t val; - - if( var_Get( p_object->p_libvlc, psz_name, &val ) ) - { - p_bridge = NULL; - } - else - { - p_bridge = val.p_address; - } - - return p_bridge; -} - /* * Bridge out @@ -213,6 +195,8 @@ static int OpenOut( vlc_object_t *p_this ) p_stream->p_cfg ); p_sys = malloc( sizeof( out_sout_stream_sys_t ) ); + if( unlikely( !p_sys ) ) + return VLC_ENOMEM; p_sys->b_inited = false; var_Create( p_this->p_libvlc, "bridge-lock", VLC_VAR_MUTEX ); @@ -272,17 +256,13 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream, p_sys->psz_name ); + p_bridge = var_GetAddress( p_stream->p_libvlc, p_sys->psz_name ); if ( p_bridge == NULL ) { - vlc_object_t *p_libvlc = VLC_OBJECT( p_stream->p_libvlc ); - vlc_value_t val; - - p_bridge = malloc( sizeof( bridge_t ) ); + p_bridge = xmalloc( sizeof( bridge_t ) ); - var_Create( p_libvlc, p_sys->psz_name, VLC_VAR_ADDRESS ); - val.p_address = p_bridge; - var_Set( p_libvlc, p_sys->psz_name, val ); + var_Create( p_stream->p_libvlc, p_sys->psz_name, VLC_VAR_ADDRESS ); + var_SetAddress( p_stream->p_libvlc, p_sys->psz_name, p_bridge ); p_bridge->i_es_num = 0; p_bridge->pp_es = NULL; @@ -296,11 +276,10 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) if ( i == p_bridge->i_es_num ) { - p_bridge->pp_es = realloc( p_bridge->pp_es, - (p_bridge->i_es_num + 1) - * sizeof(bridged_es_t *) ); + p_bridge->pp_es = xrealloc( p_bridge->pp_es, + (p_bridge->i_es_num + 1) * sizeof(bridged_es_t *) ); p_bridge->i_es_num++; - p_bridge->pp_es[i] = malloc( sizeof(bridged_es_t) ); + p_bridge->pp_es[i] = xmalloc( sizeof(bridged_es_t) ); } p_sys->p_es = p_es = p_bridge->pp_es[i]; @@ -312,7 +291,7 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) p_es->b_empty = false; p_es->id = NULL; - p_es->i_last = 0; + p_es->i_last = VLC_TS_INVALID; p_es->b_changed = true; msg_Dbg( p_stream, "bridging out input codec=%4.4s id=%d pos=%d", @@ -384,7 +363,6 @@ static int SendOut( sout_stream_t *p_stream, sout_stream_id_t *id, typedef struct in_sout_stream_sys_t { - sout_stream_t *p_out; vlc_mutex_t *p_lock; int i_id_offset; mtime_t i_delay; @@ -413,9 +391,10 @@ static int OpenIn( vlc_object_t *p_this ) vlc_value_t val; p_sys = malloc( sizeof( in_sout_stream_sys_t ) ); + if( unlikely( !p_sys ) ) + return VLC_ENOMEM; - p_sys->p_out = sout_StreamNew( p_stream->p_sout, p_stream->psz_next ); - if( !p_sys->p_out ) + if( !p_stream->p_next ) { msg_Err( p_stream, "cannot create chain" ); free( p_sys ); @@ -455,8 +434,8 @@ static int OpenIn( vlc_object_t *p_this ) var_Get( p_stream, SOUT_CFG_PREFIX_IN "placeholder-delay", &val ); p_sys->i_placeholder_delay = (mtime_t)val.i_int * 1000; - p_sys->i_last_video = 0; - p_sys->i_last_audio = 0; + p_sys->i_last_video = VLC_TS_INVALID; + p_sys->i_last_audio = VLC_TS_INVALID; p_sys->id_video = NULL; p_sys->id_audio = NULL; @@ -480,7 +459,6 @@ static void CloseIn( vlc_object_t * p_this ) sout_stream_t *p_stream = (sout_stream_t*)p_this; in_sout_stream_sys_t *p_sys = (in_sout_stream_sys_t *)p_stream->p_sys; - sout_StreamDelete( p_sys->p_out ); p_stream->p_sout->i_out_pace_nocontrol--; free( p_sys->psz_name ); @@ -500,7 +478,7 @@ static sout_stream_id_t * AddIn( sout_stream_t *p_stream, es_format_t *p_fmt ) sout_stream_id_t *id = malloc( sizeof( sout_stream_id_t ) ); if( !id ) return NULL; - id->id = p_sys->p_out->pf_add( p_sys->p_out, p_fmt ); + id->id = p_stream->p_next->pf_add( p_stream->p_next, p_fmt ); if( !id->id ) { free( id ); @@ -535,7 +513,7 @@ static int DelIn( sout_stream_t *p_stream, sout_stream_id_t *id ) if( id == p_sys->id_video ) p_sys->id_video = NULL; if( id == p_sys->id_audio ) p_sys->id_audio = NULL; - int ret = p_sys->p_out->pf_del( p_sys->p_out, id->id ); + int ret = p_stream->p_next->pf_del( p_stream->p_next, id->id ); free( id ); return ret; @@ -552,12 +530,12 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, /* First forward the packet for our own ES */ if( !p_sys->b_placeholder ) - p_sys->p_out->pf_send( p_sys->p_out, id->id, p_buffer ); + p_stream->p_next->pf_send( p_stream->p_next, id->id, p_buffer ); /* Then check all bridged streams */ vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream, p_sys->psz_name ); + p_bridge = var_GetAddress( p_stream->p_libvlc, p_sys->psz_name ); if( p_bridge ) { @@ -589,7 +567,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, { if ( p_bridge->pp_es[i]->b_empty && p_bridge->pp_es[i]->id != NULL ) { - p_sys->p_out->pf_del( p_sys->p_out, p_bridge->pp_es[i]->id ); + p_stream->p_next->pf_del( p_stream->p_next, p_bridge->pp_es[i]->id ); } else { @@ -603,8 +581,8 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, p_bridge->pp_es[i]->fmt.i_id += p_sys->i_id_offset; if( !p_sys->b_placeholder ) { - p_bridge->pp_es[i]->id = p_sys->p_out->pf_add( - p_sys->p_out, &p_bridge->pp_es[i]->fmt ); + p_bridge->pp_es[i]->id = p_stream->p_next->pf_add( + p_stream->p_next, &p_bridge->pp_es[i]->fmt ); if ( p_bridge->pp_es[i]->id == NULL ) { msg_Warn( p_stream, "couldn't create chain for id %d", @@ -627,7 +605,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, && p_bridge->pp_es[i]->i_last < i_date ) { if( !p_sys->b_placeholder ) - p_sys->p_out->pf_del( p_sys->p_out, + p_stream->p_next->pf_del( p_stream->p_next, p_bridge->pp_es[i]->id ); p_bridge->pp_es[i]->fmt.i_id -= p_sys->i_id_offset; p_bridge->pp_es[i]->b_changed = true; @@ -661,7 +639,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, ( p_bridge->pp_es[i]->fmt.i_cat == VIDEO_ES && p_bridge->pp_es[i]->p_block->i_flags & BLOCK_FLAG_TYPE_I ) ) { - p_sys->p_out->pf_send( p_sys->p_out, + p_stream->p_next->pf_send( p_stream->p_next, newid, p_bridge->pp_es[i]->p_block ); p_sys->i_state = placeholder_off; @@ -673,14 +651,14 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, break; p_sys->i_last_audio = i_date; default: - p_sys->p_out->pf_send( p_sys->p_out, + p_stream->p_next->pf_send( p_stream->p_next, newid?newid:p_bridge->pp_es[i]->id, p_bridge->pp_es[i]->p_block ); break; } } else /* !b_placeholder */ - p_sys->p_out->pf_send( p_sys->p_out, + p_stream->p_next->pf_send( p_stream->p_next, p_bridge->pp_es[i]->id, p_bridge->pp_es[i]->p_block ); } @@ -695,12 +673,11 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, if( b_no_es ) { - vlc_object_t *p_libvlc = VLC_OBJECT( p_stream->p_libvlc ); for ( i = 0; i < p_bridge->i_es_num; i++ ) free( p_bridge->pp_es[i] ); free( p_bridge->pp_es ); free( p_bridge ); - var_Destroy( p_libvlc, p_sys->psz_name ); + var_Destroy( p_stream->p_libvlc, p_sys->psz_name ); } } @@ -714,7 +691,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, || p_buffer->i_flags & BLOCK_FLAG_TYPE_I ) ) || p_sys->i_state == placeholder_on ) { - p_sys->p_out->pf_send( p_sys->p_out, id->id, p_buffer ); + p_stream->p_next->pf_send( p_stream->p_next, id->id, p_buffer ); p_sys->i_state = placeholder_on; } else @@ -723,7 +700,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, case AUDIO_ES: if( p_sys->i_last_audio + p_sys->i_placeholder_delay < i_date ) - p_sys->p_out->pf_send( p_sys->p_out, id->id, p_buffer ); + p_stream->p_next->pf_send( p_stream->p_next, id->id, p_buffer ); else block_Release( p_buffer ); break;