X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Fbridge.c;h=edf0f7fd1684b62048c78ad50d71705c0351e3de;hb=299bbb5597cd6d5fe0a37de64473161cd802c699;hp=8b20b8da625755162212498f91ef9b6983240635;hpb=e40d134c69b144327fd1d2001e8b85640f5c7cb9;p=vlc diff --git a/modules/stream_out/bridge.c b/modules/stream_out/bridge.c index 8b20b8da62..edf0f7fd16 100644 --- a/modules/stream_out/bridge.c +++ b/modules/stream_out/bridge.c @@ -25,7 +25,12 @@ * Preamble *****************************************************************************/ -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include #include @@ -37,6 +42,11 @@ "Integer identifier for this elementary stream. This will be used to " \ "\"find\" this stream later." ) +#define DEST_TEXT N_( "Destination bridge-in name" ) +#define DEST_LONGTEXT N_( \ + "Name of the destination bridge-in. If you do not need more " \ + "than one bridge-in at a time, you can discard this option." ) + #define DELAY_TEXT N_("Delay") #define DELAY_LONGTEXT N_("Pictures coming from the picture video outputs " \ "will be delayed according to this value (in milliseconds, should be "\ @@ -46,6 +56,11 @@ #define ID_OFFSET_LONGTEXT N_("Offset to add to the stream IDs specified in " \ "bridge_out to obtain the stream IDs bridge_in will register.") +#define NAME_TEXT N_( "Name of current instance" ) +#define NAME_LONGTEXT N_( \ + "Name of this bridge-in instance. If you do not need more " \ + "than one bridge-in at a time, you can discard this option." ) + static int OpenOut ( vlc_object_t * ); static void CloseOut( vlc_object_t * ); static int OpenIn ( vlc_object_t * ); @@ -55,8 +70,8 @@ static void CloseIn ( vlc_object_t * ); #define SOUT_CFG_PREFIX_IN "sout-bridge-in-" vlc_module_begin(); - set_shortname( _("Bridge")); - set_description( _("Bridge stream output")); + set_shortname( N_("Bridge")); + set_description( N_("Bridge stream output")); add_submodule(); set_section( N_("Bridge out"), NULL ); set_capability( "sout stream", 50 ); @@ -65,7 +80,9 @@ vlc_module_begin(); set_category( CAT_SOUT ); set_subcategory( SUBCAT_SOUT_STREAM );*/ add_integer( SOUT_CFG_PREFIX_OUT "id", 0, NULL, ID_TEXT, ID_LONGTEXT, - VLC_FALSE ); + false ); + add_string( SOUT_CFG_PREFIX_OUT "in-name", "default", NULL, + DEST_TEXT, DEST_LONGTEXT, false ); set_callbacks( OpenOut, CloseOut ); add_submodule(); @@ -75,9 +92,11 @@ vlc_module_begin(); /*set_category( CAT_SOUT ); set_subcategory( SUBCAT_SOUT_STREAM );*/ add_integer( SOUT_CFG_PREFIX_IN "delay", 0, NULL, DELAY_TEXT, - DELAY_LONGTEXT, VLC_FALSE ); + DELAY_LONGTEXT, false ); add_integer( SOUT_CFG_PREFIX_IN "id-offset", 8192, NULL, ID_OFFSET_TEXT, - ID_OFFSET_LONGTEXT, VLC_FALSE ); + ID_OFFSET_LONGTEXT, false ); + add_string( SOUT_CFG_PREFIX_IN "name", "default", NULL, + NAME_TEXT, NAME_LONGTEXT, false ); set_callbacks( OpenIn, CloseIn ); vlc_module_end(); @@ -86,12 +105,12 @@ vlc_module_end(); /***************************************************************************** * Local prototypes *****************************************************************************/ -static const char *ppsz_sout_options_out[] = { - "id", NULL +static const char *const ppsz_sout_options_out[] = { + "id", "in-name", NULL }; -static const char *ppsz_sout_options_in[] = { - "delay", "id-offset", NULL +static const char *const ppsz_sout_options_in[] = { + "delay", "id-offset", "name", NULL }; static sout_stream_id_t *AddOut ( sout_stream_t *, es_format_t * ); @@ -107,12 +126,12 @@ typedef struct bridged_es_t es_format_t fmt; block_t *p_block; block_t **pp_last; - vlc_bool_t b_empty; + bool b_empty; /* bridge in part */ sout_stream_id_t *id; mtime_t i_last; - vlc_bool_t b_changed; + bool b_changed; } bridged_es_t; typedef struct bridge_t @@ -121,13 +140,13 @@ typedef struct bridge_t int i_es_num; } bridge_t; -#define GetBridge(a) __GetBridge( VLC_OBJECT(a) ) -static bridge_t *__GetBridge( vlc_object_t *p_object ) +#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, "bridge-struct", &val ) ) + if( var_Get( p_object->p_libvlc, psz_name, &val ) ) { p_bridge = NULL; } @@ -149,7 +168,9 @@ typedef struct out_sout_stream_sys_t vlc_mutex_t *p_lock; bridged_es_t *p_es; int i_id; - vlc_bool_t b_inited; + bool b_inited; + + char *psz_name; } out_sout_stream_sys_t; /***************************************************************************** @@ -165,7 +186,7 @@ static int OpenOut( vlc_object_t *p_this ) p_stream->p_cfg ); p_sys = malloc( sizeof( out_sout_stream_sys_t ) ); - p_sys->b_inited = VLC_FALSE; + p_sys->b_inited = false; var_Create( p_this->p_libvlc, "bridge-lock", VLC_VAR_MUTEX ); var_Get( p_this->p_libvlc, "bridge-lock", &val ); @@ -174,6 +195,15 @@ static int OpenOut( vlc_object_t *p_this ) var_Get( p_stream, SOUT_CFG_PREFIX_OUT "id", &val ); p_sys->i_id = val.i_int; + var_Get( p_stream, SOUT_CFG_PREFIX_OUT "in-name", &val ); + if( asprintf( &p_sys->psz_name, "bridge-struct-%s", val.psz_string )<0 ) + { + free( val.psz_string ); + free( p_sys ); + return VLC_ENOMEM; + } + free( val.psz_string ); + p_stream->pf_add = AddOut; p_stream->pf_del = DelOut; p_stream->pf_send = SendOut; @@ -195,6 +225,7 @@ static void CloseOut( vlc_object_t * p_this ) p_stream->p_sout->i_out_pace_nocontrol--; + free( p_sys->psz_name ); free( p_sys ); } @@ -209,21 +240,21 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) { return NULL; } - p_sys->b_inited = VLC_TRUE; + p_sys->b_inited = true; vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream ); + p_bridge = GetBridge( p_stream, p_sys->psz_name ); if ( p_bridge == NULL ) { - vlc_object_t *p_libvlc = p_stream->p_libvlc; + vlc_object_t *p_libvlc = VLC_OBJECT( p_stream->p_libvlc ); vlc_value_t val; p_bridge = malloc( sizeof( bridge_t ) ); - var_Create( p_libvlc, "bridge-struct", VLC_VAR_ADDRESS ); + var_Create( p_libvlc, p_sys->psz_name, VLC_VAR_ADDRESS ); val.p_address = p_bridge; - var_Set( p_libvlc, "bridge-struct", val ); + var_Set( p_libvlc, p_sys->psz_name, val ); p_bridge->i_es_num = 0; p_bridge->pp_es = NULL; @@ -250,11 +281,11 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) p_es->fmt.i_id = p_sys->i_id; p_es->p_block = NULL; p_es->pp_last = &p_es->p_block; - p_es->b_empty = VLC_FALSE; + p_es->b_empty = false; p_es->id = NULL; p_es->i_last = 0; - p_es->b_changed = VLC_TRUE; + p_es->b_changed = true; msg_Dbg( p_stream, "bridging out input codec=%4.4s id=%d pos=%d", (char*)&p_es->fmt.i_codec, p_es->fmt.i_id, i ); @@ -266,6 +297,7 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) static int DelOut( sout_stream_t *p_stream, sout_stream_id_t *id ) { + VLC_UNUSED(id); out_sout_stream_sys_t *p_sys = (out_sout_stream_sys_t *)p_stream->p_sys; bridged_es_t *p_es; @@ -278,14 +310,14 @@ static int DelOut( sout_stream_t *p_stream, sout_stream_id_t *id ) p_es = p_sys->p_es; - p_es->b_empty = VLC_TRUE; + p_es->b_empty = true; block_ChainRelease( p_es->p_block ); - p_es->p_block = VLC_FALSE; + p_es->p_block = false; - p_es->b_changed = VLC_TRUE; + p_es->b_changed = true; vlc_mutex_unlock( p_sys->p_lock ); - p_sys->b_inited = VLC_FALSE; + p_sys->b_inited = false; return VLC_SUCCESS; } @@ -328,6 +360,8 @@ typedef struct in_sout_stream_sys_t vlc_mutex_t *p_lock; int i_id_offset; mtime_t i_delay; + + char *psz_name; } in_sout_stream_sys_t; /***************************************************************************** @@ -362,6 +396,15 @@ static int OpenIn( vlc_object_t *p_this ) var_Get( p_stream, SOUT_CFG_PREFIX_IN "delay", &val ); p_sys->i_delay = (mtime_t)val.i_int * 1000; + var_Get( p_stream, SOUT_CFG_PREFIX_IN "name", &val ); + if( asprintf( &p_sys->psz_name, "bridge-struct-%s", val.psz_string )<0 ) + { + free( val.psz_string ); + free( p_sys ); + return VLC_ENOMEM; + } + free( val.psz_string ); + p_stream->pf_add = AddIn; p_stream->pf_del = DelIn; p_stream->pf_send = SendIn; @@ -385,6 +428,7 @@ static void CloseIn( vlc_object_t * p_this ) sout_StreamDelete( p_sys->p_out ); p_stream->p_sout->i_out_pace_nocontrol--; + free( p_sys->psz_name ); free( p_sys ); } @@ -407,7 +451,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, { in_sout_stream_sys_t *p_sys = (in_sout_stream_sys_t *)p_stream->p_sys; bridge_t *p_bridge; - vlc_bool_t b_no_es = VLC_TRUE; + bool b_no_es = true; int i; /* First forward the packet for our own ES */ @@ -416,7 +460,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, /* Then check all bridged streams */ vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream ); + p_bridge = GetBridge( p_stream, p_sys->psz_name ); if ( p_bridge == NULL ) { vlc_mutex_unlock( p_sys->p_lock ); @@ -426,7 +470,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, for ( i = 0; i < p_bridge->i_es_num; i++ ) { if ( !p_bridge->pp_es[i]->b_empty ) - b_no_es = VLC_FALSE; + b_no_es = false; while ( p_bridge->pp_es[i]->p_block != NULL && (p_bridge->pp_es[i]->p_block->i_dts + p_sys->i_delay @@ -435,7 +479,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, < p_bridge->pp_es[i]->i_last) ) { block_t *p_block = p_bridge->pp_es[i]->p_block; - msg_Dbg( p_stream, "dropping a packet (" I64Fd ")", + msg_Dbg( p_stream, "dropping a packet (%"PRId64 ")", mdate() - p_block->i_dts - p_sys->i_delay ); p_bridge->pp_es[i]->p_block = p_bridge->pp_es[i]->p_block->p_next; @@ -475,7 +519,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, p_bridge->pp_es[i]->fmt.i_id, i ); } } - p_bridge->pp_es[i]->b_changed = VLC_FALSE; + p_bridge->pp_es[i]->b_changed = false; if ( p_bridge->pp_es[i]->b_empty ) continue; @@ -487,7 +531,7 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, { p_sys->p_out->pf_del( p_sys->p_out, 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 = VLC_TRUE; + p_bridge->pp_es[i]->b_changed = true; p_bridge->pp_es[i]->id = NULL; } continue; @@ -517,12 +561,12 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, if( b_no_es ) { - vlc_object_t *p_libvlc = p_stream->p_libvlc; + 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, "bridge-struct" ); + var_Destroy( p_libvlc, p_sys->psz_name ); } vlc_mutex_unlock( p_sys->p_lock );