X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fstream_out%2Fbridge.c;h=e1174d36f204a2f8db0fb3e82d48c4789d748828;hb=d77533f0a3c7afe9ae93d613e905277484fb183a;hp=7f63aba7305a39052f518f44737122593e138a70;hpb=66a06add9f1819b2934424d98da8e8b1aa956b99;p=vlc diff --git a/modules/stream_out/bridge.c b/modules/stream_out/bridge.c index 7f63aba730..e1174d36f2 100644 --- a/modules/stream_out/bridge.c +++ b/modules/stream_out/bridge.c @@ -1,7 +1,7 @@ /***************************************************************************** * bridge.c: bridge stream output module ***************************************************************************** - * Copyright (C) 2005 VideoLAN + * Copyright (C) 2005 the VideoLAN team * $Id$ * * Authors: Christophe Massiot @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -35,12 +35,13 @@ *****************************************************************************/ #define ID_TEXT N_("ID") #define ID_LONGTEXT N_( \ - "Specify an identifier integer for this elementary stream" ) + "Integer identifier for this elementary stream. This will be used to " \ + "\"find\" this stream later." ) #define DELAY_TEXT N_("Delay") #define DELAY_LONGTEXT N_("Pictures coming from the picture video outputs " \ - "will be delayed accordingly (in milliseconds, >= 100 ms). For high " \ - "values you will need to raise file-caching and others.") + "will be delayed according to this value (in milliseconds, should be "\ + ">= 100 ms). For high values, you will need to raise caching values." ) #define ID_OFFSET_TEXT N_("ID Offset") #define ID_OFFSET_LONGTEXT N_("Offset to add to the stream IDs specified in " \ @@ -55,25 +56,26 @@ 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")); add_submodule(); - set_shortname( _("Bridge out")); - set_description( _("Bridge out stream output") ); + set_section( N_("Bridge out"), NULL ); set_capability( "sout stream", 50 ); add_shortcut( "bridge-out" ); + /* Only usable with VLM. No category so not in gui preferences set_category( CAT_SOUT ); - set_subcategory( SUBCAT_SOUT_STREAM ); + set_subcategory( SUBCAT_SOUT_STREAM );*/ add_integer( SOUT_CFG_PREFIX_OUT "id", 0, NULL, ID_TEXT, ID_LONGTEXT, VLC_FALSE ); set_callbacks( OpenOut, CloseOut ); add_submodule(); - set_shortname( _("Bridge in")); - set_description( _("Bridge in stream output") ); + set_section( N_("Bridge in"), NULL ); set_capability( "sout stream", 50 ); add_shortcut( "bridge-in" ); - set_category( CAT_SOUT ); - set_subcategory( SUBCAT_SOUT_STREAM ); - add_integer( SOUT_CFG_PREFIX_IN "delay", 100, NULL, DELAY_TEXT, + /*set_category( CAT_SOUT ); + set_subcategory( SUBCAT_SOUT_STREAM );*/ + add_integer( SOUT_CFG_PREFIX_IN "delay", 0, NULL, DELAY_TEXT, DELAY_LONGTEXT, VLC_FALSE ); add_integer( SOUT_CFG_PREFIX_IN "id-offset", 8192, NULL, ID_OFFSET_TEXT, ID_OFFSET_LONGTEXT, VLC_FALSE ); @@ -108,7 +110,6 @@ typedef struct bridged_es_t block_t *p_block; block_t **pp_last; vlc_bool_t b_empty; - int i_id; /* bridge in part */ sout_stream_id_t *id; @@ -136,7 +137,7 @@ static bridge_t *__GetBridge( vlc_object_t *p_object ) else { p_bridge = val.p_address; - } + } return p_bridge; } @@ -149,9 +150,9 @@ static bridge_t *__GetBridge( vlc_object_t *p_object ) 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; - int i_position; } out_sout_stream_sys_t; /***************************************************************************** @@ -159,7 +160,7 @@ typedef struct out_sout_stream_sys_t *****************************************************************************/ static int OpenOut( vlc_object_t *p_this ) { - sout_stream_t *p_stream = (sout_stream_t*)p_this; + sout_stream_t *p_stream = (sout_stream_t *)p_this; out_sout_stream_sys_t *p_sys; vlc_value_t val; @@ -181,7 +182,6 @@ static int OpenOut( vlc_object_t *p_this ) p_stream->p_sys = (sout_stream_sys_t *)p_sys; - /* update p_sout->i_out_pace_nocontrol */ p_stream->p_sout->i_out_pace_nocontrol++; return VLC_SUCCESS; @@ -242,14 +242,12 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) p_bridge->pp_es = realloc( p_bridge->pp_es, (p_bridge->i_es_num + 1) * sizeof(bridged_es_t *) ); - p_sys->i_position = p_bridge->i_es_num; p_bridge->i_es_num++; p_bridge->pp_es[i] = malloc( sizeof(bridged_es_t) ); } - else - p_sys->i_position = i; - p_es = p_bridge->pp_es[ p_sys->i_position ]; + p_sys->p_es = p_es = p_bridge->pp_es[i]; + p_es->fmt = *p_fmt; p_es->fmt.i_id = p_sys->i_id; p_es->p_block = NULL; @@ -261,7 +259,7 @@ static sout_stream_id_t * AddOut( sout_stream_t *p_stream, es_format_t *p_fmt ) p_es->b_changed = VLC_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, p_sys->i_position ); + (char*)&p_es->fmt.i_codec, p_es->fmt.i_id, i ); vlc_mutex_unlock( p_sys->p_lock ); @@ -271,7 +269,6 @@ 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 ) { out_sout_stream_sys_t *p_sys = (out_sout_stream_sys_t *)p_stream->p_sys; - bridge_t *p_bridge; bridged_es_t *p_es; if ( !p_sys->b_inited ) @@ -281,8 +278,7 @@ static int DelOut( sout_stream_t *p_stream, sout_stream_id_t *id ) vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream ); - p_es = p_bridge->pp_es[ p_sys->i_position ]; + p_es = p_sys->p_es; p_es->b_empty = VLC_TRUE; block_ChainRelease( p_es->p_block ); @@ -291,6 +287,8 @@ static int DelOut( sout_stream_t *p_stream, sout_stream_id_t *id ) p_es->b_changed = VLC_TRUE; vlc_mutex_unlock( p_sys->p_lock ); + p_sys->b_inited = VLC_FALSE; + return VLC_SUCCESS; } @@ -298,7 +296,6 @@ static int SendOut( sout_stream_t *p_stream, sout_stream_id_t *id, block_t *p_buffer ) { out_sout_stream_sys_t *p_sys = (out_sout_stream_sys_t *)p_stream->p_sys; - bridge_t *p_bridge; bridged_es_t *p_es; if ( (out_sout_stream_sys_t *)id != p_sys ) @@ -309,8 +306,7 @@ static int SendOut( sout_stream_t *p_stream, sout_stream_id_t *id, vlc_mutex_lock( p_sys->p_lock ); - p_bridge = GetBridge( p_stream ); - p_es = p_bridge->pp_es[ p_sys->i_position ]; + p_es = p_sys->p_es; *p_es->pp_last = p_buffer; while ( p_buffer != NULL ) { @@ -434,11 +430,14 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, b_no_es = VLC_FALSE; while ( p_bridge->pp_es[i]->p_block != NULL - && (p_bridge->pp_es[i]->p_block->i_dts < mdate() + && (p_bridge->pp_es[i]->p_block->i_dts + p_sys->i_delay + < mdate() || p_bridge->pp_es[i]->p_block->i_dts + p_sys->i_delay < 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 ")", + 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; block_Release( p_block ); @@ -457,7 +456,9 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, } else { - if ( p_bridge->pp_es[i]->p_block == NULL ) + /* We need at least two packets to enter the mux. */ + if ( p_bridge->pp_es[i]->p_block == NULL + || p_bridge->pp_es[i]->p_block->p_next == NULL ) { continue; } @@ -496,10 +497,9 @@ static int SendIn( sout_stream_t *p_stream, sout_stream_id_t *id, if ( p_bridge->pp_es[i]->id != NULL ) { block_t *p_block = p_bridge->pp_es[i]->p_block; - p_bridge->pp_es[i]->i_last = p_bridge->pp_es[i]->p_block->i_dts - + p_bridge->pp_es[i]->p_block->i_length; while ( p_block != NULL ) { + p_bridge->pp_es[i]->i_last = p_block->i_dts; p_block->i_pts += p_sys->i_delay; p_block->i_dts += p_sys->i_delay; p_block = p_block->p_next;