X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fstream_output%2Fstream_output.c;h=82168ce5076ba91d04f97fedb7ef7ba6f858a632;hb=6b822f38be4f5958b1e271324bc73f4a7a98b0bc;hp=9406c7516036175dab290d5b0a351bb872cabac3;hpb=7dd2f1548a90c339f7e91ff469a6ad3ec9eecdd4;p=vlc diff --git a/src/stream_output/stream_output.c b/src/stream_output/stream_output.c index 9406c75160..82168ce507 100644 --- a/src/stream_output/stream_output.c +++ b/src/stream_output/stream_output.c @@ -31,7 +31,7 @@ #include /* free() */ #include /* sprintf() */ -#include /* strerror() */ +#include #include #include @@ -103,8 +103,11 @@ sout_instance_t *__sout_NewInstance( vlc_object_t *p_parent, char * psz_dest ) /* attach it for inherit */ vlc_object_attach( p_sout, p_parent ); - p_sout->p_stream = sout_StreamNew( p_sout, p_sout->psz_chain ); + /* */ + var_Create( p_sout, "sout-mux-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); + /* */ + p_sout->p_stream = sout_StreamNew( p_sout, p_sout->psz_chain ); if( p_sout->p_stream == NULL ) { msg_Err( p_sout, "stream chain failed for `%s'", p_sout->psz_chain ); @@ -144,6 +147,59 @@ void sout_DeleteInstance( sout_instance_t * p_sout ) vlc_object_destroy( p_sout ); } +/***************************************************************************** + * + *****************************************************************************/ +void sout_UpdateStatistic( sout_instance_t *p_sout, sout_statistic_t i_type, int i_delta ) +{ + input_thread_t *p_input; + int i_bytes; /* That's pretty stupid to define it as an integer, it will overflow + really fast ... */ + + if( !p_sout->p_libvlc->b_stats ) + return; + + /* FIXME that's ugly + * TODO add a private (ie not VLC_EXPORTed) input_UpdateStatistic for that */ + p_input = vlc_object_find( p_sout, VLC_OBJECT_INPUT, FIND_PARENT ); + if( !p_input || p_input->i_state == INIT_S || p_input->i_state == ERROR_S ) + return; + + switch( i_type ) + { +#define I(c) stats_UpdateInteger( p_input, p_input->p->counters.c, i_delta, NULL ) + case SOUT_STATISTIC_DECODED_VIDEO: + I(p_decoded_video); + break; + case SOUT_STATISTIC_DECODED_AUDIO: + I(p_decoded_audio); + break; + case SOUT_STATISTIC_DECODED_SUBTITLE: + I(p_decoded_sub); + break; +#if 0 + case SOUT_STATISTIC_ENCODED_VIDEO: + case SOUT_STATISTIC_ENCODED_AUDIO: + case SOUT_STATISTIC_ENCODED_SUBTITLE: + msg_Warn( p_sout, "Not yet supported statistic type %d", i_type ); + break; +#endif + + case SOUT_STATISTIC_SENT_PACKET: + I(p_sout_sent_packets); + break; +#undef I + case SOUT_STATISTIC_SENT_BYTE: + if( !stats_UpdateInteger( p_input, p_input->p->counters.p_sout_sent_bytes, i_delta, &i_bytes ) ) + stats_UpdateFloat( p_input, p_input->p->counters.p_sout_send_bitrate, i_bytes, NULL ); + break; + + default: + msg_Err( p_sout, "Invalid statistic type %d (internal error)", i_type ); + break; + } + vlc_object_release( p_input ); +} /***************************************************************************** * Packetizer/Input *****************************************************************************/ @@ -309,7 +365,7 @@ int sout_AccessOutSeek( sout_access_out_t *p_access, off_t i_pos ) /***************************************************************************** * sout_AccessRead: *****************************************************************************/ -int sout_AccessOutRead( sout_access_out_t *p_access, block_t *p_buffer ) +ssize_t sout_AccessOutRead( sout_access_out_t *p_access, block_t *p_buffer ) { return( p_access->pf_read ? p_access->pf_read( p_access, p_buffer ) : VLC_EGENERIC ); @@ -318,28 +374,16 @@ int sout_AccessOutRead( sout_access_out_t *p_access, block_t *p_buffer ) /***************************************************************************** * sout_AccessWrite: *****************************************************************************/ -int sout_AccessOutWrite( sout_access_out_t *p_access, block_t *p_buffer ) +ssize_t sout_AccessOutWrite( sout_access_out_t *p_access, block_t *p_buffer ) { - int i_total = 0; + const unsigned i_packets_gather = 30; p_access->i_writes++; p_access->i_sent_bytes += p_buffer->i_buffer; - if( p_access->p_libvlc->b_stats && p_access->i_writes % 30 == 0 ) + if( (p_access->i_writes % i_packets_gather) == 0 ) { - /* Access_out -> sout_instance -> input_thread_t */ - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_access, VLC_OBJECT_INPUT, - FIND_PARENT ); - if( p_input ) - { - stats_UpdateInteger( p_input, p_input->p->counters.p_sout_sent_packets, - 30, NULL ); - stats_UpdateInteger( p_input, p_input->p->counters.p_sout_sent_bytes, - p_access->i_sent_bytes, &i_total ); - stats_UpdateFloat( p_input, p_input->p->counters.p_sout_send_bitrate, - (float)i_total, NULL ); - p_access->i_sent_bytes = 0; - vlc_object_release( p_input ); - } + sout_UpdateStatistic( p_access->p_sout, SOUT_STATISTIC_SENT_PACKET, i_packets_gather ); + sout_UpdateStatistic( p_access->p_sout, SOUT_STATISTIC_SENT_BYTE, p_access->i_sent_bytes ); + p_access->i_sent_bytes = 0; } return p_access->pf_write( p_access, p_buffer ); } @@ -470,7 +514,7 @@ sout_input_t *sout_MuxAddStream( sout_mux_t *p_mux, es_format_t *p_fmt ) if( !p_mux->b_add_stream_any_time && !p_mux->b_waiting_stream ) { msg_Err( p_mux, "cannot add a new stream (unsupported while muxing " - "to this format)" ); + "to this format). You can try increasing sout-mux-caching value" ); return NULL; } @@ -551,22 +595,16 @@ void sout_MuxSendBuffer( sout_mux_t *p_mux, sout_input_t *p_input, if( p_mux->b_waiting_stream ) { + const int64_t i_caching = var_GetInteger( p_mux->p_sout, "sout-mux-caching" ) * I64C(1000); + if( p_mux->i_add_stream_start < 0 ) - { p_mux->i_add_stream_start = p_buffer->i_dts; - } - if( p_mux->i_add_stream_start >= 0 && - p_mux->i_add_stream_start + I64C(1500000) < p_buffer->i_dts ) - { - /* Wait until we have more than 1.5 seconds worth of data - * before start muxing */ - p_mux->b_waiting_stream = VLC_FALSE; - } - else - { + /* Wait until we have enought data before muxing */ + if( p_mux->i_add_stream_start < 0 || + p_buffer->i_dts < p_mux->i_add_stream_start + i_caching ) return; - } + p_mux->b_waiting_stream = VLC_FALSE; } p_mux->pf_mux( p_mux ); }