diff --git a/modules/stream_out/chromecast/cast.cpp b/modules/stream_out/chromecast/cast.cpp index c4356ad2a1..48b34bfe2c 100644 --- a/modules/stream_out/chromecast/cast.cpp +++ b/modules/stream_out/chromecast/cast.cpp @@ -50,7 +50,8 @@ struct sout_stream_sys_t , b_supports_video(has_video) , i_port(port) , es_changed( true ) - , cc_has_input( false) + , cc_has_input( false ) + , out_force_reload( false ) , out_streams_added( 0 ) , transcode_attempt_idx( 0 ) , previous_state( Authenticating ) @@ -83,6 +84,7 @@ struct sout_stream_sys_t bool es_changed; bool cc_has_input; + bool out_force_reload; std::vector streams; std::vector out_streams; unsigned int out_streams_added; @@ -294,7 +296,8 @@ static sout_stream_id_sys_t *Add(sout_stream_t *p_stream, const es_format_t *p_f } -static void Del(sout_stream_t *p_stream, sout_stream_id_sys_t *id) +static void DelInternal(sout_stream_t *p_stream, sout_stream_id_sys_t *id, + bool reset_config) { sout_stream_sys_t *p_sys = p_stream->p_sys; @@ -313,7 +316,8 @@ static void Del(sout_stream_t *p_stream, sout_stream_id_sys_t *id) if (*out_it == id) { p_sys->out_streams.erase(out_it); - p_sys->es_changed = true; + p_sys->es_changed = reset_config; + p_sys->out_force_reload = reset_config; break; } out_it++; @@ -338,6 +342,11 @@ static void Del(sout_stream_t *p_stream, sout_stream_id_sys_t *id) } } +static void Del(sout_stream_t *p_stream, sout_stream_id_sys_t *id) +{ + DelInternal(p_stream, id, true); +} + /** * Transcode steps: * 0: Accept HEVC/VP9 & all supported audio formats @@ -478,7 +487,7 @@ bool sout_stream_sys_t::UpdateOutput( sout_stream_t *p_stream ) else continue; - bool b_found = false; + bool b_found = out_force_reload; for (std::vector::iterator out_it = out_streams.begin(); out_it != out_streams.end() && !b_found; ++out_it) { @@ -496,9 +505,10 @@ bool sout_stream_sys_t::UpdateOutput( sout_stream_t *p_stream ) } /* Don't restart sout and CC session if streams didn't change */ - if (new_streams.size() == out_streams.size() && !b_out_streams_changed) + if (!out_force_reload && new_streams.size() == out_streams.size() && !b_out_streams_changed) return true; + out_force_reload = false; out_streams = new_streams; std::stringstream ssout; @@ -695,11 +705,7 @@ static int Send(sout_stream_t *p_stream, sout_stream_id_sys_t *id, int ret = sout_StreamIdSend(p_sys->p_out, next_id, p_buffer); if (ret != VLC_SUCCESS) - { - bool was_es_changed = p_sys->es_changed; - Del(p_stream, id); - p_sys->es_changed = was_es_changed; - } + DelInternal(p_stream, id, false); return ret; }