X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Flive555.cpp;h=b23264cf2d665b96409f666efaaabb163e1986e1;hb=fa0dc29afabea001cf21db04766b003e5cf7845e;hp=a59a23d69bb161640d7490806bf3d06388157206;hpb=d93e3c37b9d1c93c80800fab7a92968fba3fc372;p=vlc diff --git a/modules/demux/live555.cpp b/modules/demux/live555.cpp index a59a23d69b..b23264cf2d 100644 --- a/modules/demux/live555.cpp +++ b/modules/demux/live555.cpp @@ -47,7 +47,6 @@ #include #include -#include #include #include @@ -74,18 +73,13 @@ using namespace std; static int Open ( vlc_object_t * ); static void Close( vlc_object_t * ); -#define CACHING_TEXT N_("Caching value (ms)") -#define CACHING_LONGTEXT N_( \ - "Allows you to modify the default caching value for RTSP streams. This " \ - "value should be set in millisecond units." ) - #define KASENNA_TEXT N_( "Kasenna RTSP dialect") #define KASENNA_LONGTEXT N_( "Kasenna servers use an old and nonstandard " \ "dialect of RTSP. With this parameter VLC will try this dialect, but "\ "then it cannot connect to normal RTSP servers." ) #define WMSERVER_TEXT N_("WMServer RTSP dialect") -#define WMSERVER_LONGTEXT N_("WMServer uses an unstandard dialect " \ +#define WMSERVER_LONGTEXT N_("WMServer uses a nonstandard dialect " \ "of RTSP. Selecting this parameter will tell VLC to assume some " \ "options contrary to RFC 2326 guidelines.") @@ -129,9 +123,6 @@ vlc_module_begin () N_("HTTP tunnel port"), N_("Port to use for tunneling the RTSP/RTP over HTTP."), true ) - add_integer("rtsp-caching", 4 * DEFAULT_PTS_DELAY / 1000, - CACHING_TEXT, CACHING_LONGTEXT, true ) - change_safe() add_bool( "rtsp-kasenna", false, KASENNA_TEXT, KASENNA_LONGTEXT, true ) change_safe() @@ -174,6 +165,8 @@ typedef struct int64_t i_pts; float i_npt; + bool b_selected; + } live_track_t; struct timeout_thread_t @@ -198,7 +191,7 @@ struct demux_sys_t /* */ int i_track; - live_track_t **track; /* XXX mallocated */ + live_track_t **track; /* Weird formats */ asf_header_t asfh; @@ -293,7 +286,6 @@ static int Open ( vlc_object_t *p_this ) return VLC_EGENERIC; } } - var_Create( p_demux, "rtsp-caching", VLC_VAR_INTEGER|VLC_VAR_DOINHERIT ); p_demux->pf_demux = Demux; p_demux->pf_control= Control; @@ -307,8 +299,7 @@ static int Open ( vlc_object_t *p_this ) p_sys->env = NULL; p_sys->ms = NULL; p_sys->rtsp = NULL; - p_sys->i_track = 0; - p_sys->track = NULL; + TAB_INIT( p_sys->i_track, p_sys->track ); p_sys->i_pcr = 0; p_sys->i_npt = 0.; p_sys->i_npt_start = 0.; @@ -463,8 +454,7 @@ static void Close( vlc_object_t *p_this ) free( tk->p_buffer ); free( tk ); } - - if( p_sys->i_track ) free( p_sys->track ); + TAB_CLEAN( p_sys->i_track, p_sys->track ); if( p_sys->p_out_asf ) stream_Delete( p_sys->p_out_asf ); delete p_sys->scheduler; free( p_sys->p_sdp ); @@ -689,7 +679,7 @@ static int SessionsSetup( demux_t *p_demux ) MediaSubsessionIterator *iter = NULL; MediaSubsession *sub = NULL; - bool b_rtsp_tcp = false; + bool b_rtsp_tcp; int i_client_port; int i_return = VLC_SUCCESS; unsigned int i_buffer = 0; @@ -789,6 +779,11 @@ static int SessionsSetup( demux_t *p_demux ) p_sys->env->getResultMsg() ); continue; } + else + { + var_SetBool( p_demux, "rtsp-tcp", true ); + b_rtsp_tcp = true; + } } } @@ -820,6 +815,7 @@ static int SessionsSetup( demux_t *p_demux ) tk->b_rtcp_sync = false; tk->i_pts = VLC_TS_INVALID; tk->i_npt = 0.; + tk->b_selected = true; tk->i_buffer = 65536; tk->p_buffer = (uint8_t *)malloc( 65536 ); if( !tk->p_buffer ) @@ -1079,10 +1075,7 @@ static int SessionsSetup( demux_t *p_demux ) if( tk->p_es || tk->b_quicktime || ( tk->b_muxed && tk->p_out_muxed ) || ( tk->b_asf && p_sys->p_out_asf ) ) { - /* Append */ - p_sys->track = (live_track_t**)xrealloc( p_sys->track, - sizeof( live_track_t ) * ( p_sys->i_track + 1 ) ); - p_sys->track[p_sys->i_track++] = tk; + TAB_APPEND_CAST( (live_track_t **), p_sys->i_track, p_sys->track, tk ); } else { @@ -1194,6 +1187,44 @@ static int Demux( demux_t *p_demux ) { live_track_t *tk = p_sys->track[i]; + if( tk->p_es ) + { + bool b; + es_out_Control( p_demux->out, ES_OUT_GET_ES_STATE, tk->p_es, &b ); + if( !b && tk->b_selected ) + { + tk->b_selected = false; + p_sys->rtsp->sendTeardownCommand( *tk->sub, NULL ); + } + else if( b && !tk->b_selected) + { + bool b_rtsp_tcp = var_GetBool( p_demux, "rtsp-tcp" ) || + var_GetBool( p_demux, "rtsp-http" ); + p_sys->rtsp->sendSetupCommand( *tk->sub, default_live555_callback, False, + toBool( b_rtsp_tcp ), + toBool( p_sys->b_force_mcast && !b_rtsp_tcp ) ); + if( !wait_Live555_response( p_demux ) ) + { + msg_Err( p_demux, "SETUP of'%s/%s' failed %s", + tk->sub->mediumName(), tk->sub->codecName(), + p_sys->env->getResultMsg() ); + } + else + { + p_sys->rtsp->sendPlayCommand( *tk->sub, default_live555_callback, -1, -1, p_sys->ms->scale() ); + if( !wait_Live555_response(p_demux) ) + { + msg_Err( p_demux, "RTSP PLAY failed %s", p_sys->env->getResultMsg() ); + p_sys->rtsp->sendTeardownCommand( *tk->sub, NULL ); + } + else + tk->b_selected = true; + } + if( !tk->b_selected ) + es_out_Control( p_demux->out, ES_OUT_SET_ES_STATE, tk->p_es, false ); + } + } + if( tk->b_asf || tk->b_muxed ) b_send_pcr = false; #if 0 @@ -1553,7 +1584,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) case DEMUX_GET_PTS_DELAY: pi64 = (int64_t*)va_arg( args, int64_t * ); - *pi64 = var_GetInteger( p_demux, "rtsp-caching" ) * 1000; + *pi64 = INT64_C(1000) + * var_InheritInteger( p_demux, "network-caching" ); return VLC_SUCCESS; default: @@ -1589,13 +1621,11 @@ static int RollOverTcp( demux_t *p_demux ) free( tk->p_buffer ); free( tk ); } - if( p_sys->i_track ) free( p_sys->track ); + TAB_CLEAN( p_sys->i_track, p_sys->track ); if( p_sys->p_out_asf ) stream_Delete( p_sys->p_out_asf ); p_sys->ms = NULL; p_sys->rtsp = NULL; - p_sys->track = NULL; - p_sys->i_track = 0; p_sys->b_no_data = true; p_sys->i_no_data_ti = 0; p_sys->p_out_asf = NULL; @@ -1646,7 +1676,6 @@ static block_t *StreamParseAsf( demux_t *p_demux, live_track_t *tk, unsigned i_length_offset = (p_data[1] << 16) | (p_data[2] << 8) | (p_data[3] ); - bool b_key = i_flags & 0x80; bool b_length = i_flags & 0x40; bool b_relative_ts = i_flags & 0x20; bool b_duration = i_flags & 0x10; @@ -1931,12 +1960,21 @@ static void StreamClose( void *p_private ) live_track_t *tk = (live_track_t*)p_private; demux_t *p_demux = tk->p_demux; demux_sys_t *p_sys = p_demux->p_sys; - - msg_Dbg( p_demux, "StreamClose" ); - + tk->b_selected = false; p_sys->event_rtsp = 0xff; p_sys->event_data = 0xff; - p_sys->b_error = true; + + es_out_Control( p_demux->out, ES_OUT_SET_ES_STATE, tk->p_es, false ); + + int nb_tracks = 0; + for( int i = 0; i < p_sys->i_track; i++ ) + { + if( p_sys->track[i]->b_selected ) + nb_tracks++; + } + msg_Dbg( p_demux, "RTSP track Close, %d track remaining", nb_tracks ); + if( !nb_tracks ) + p_sys->b_error = true; } @@ -1964,6 +2002,7 @@ static void TaskInterruptData( void *p_private ) /***************************************************************************** * *****************************************************************************/ +VLC_NORETURN static void* TimeoutPrevention( void *p_data ) { timeout_thread_t *p_timeout = (timeout_thread_t *)p_data;