fix for segfault when feedback timeout causes reset

This commit is contained in:
F. Duncanh
2026-02-11 12:07:34 -05:00
parent eb56b09b27
commit 4764e4619e
2 changed files with 7 additions and 3 deletions

View File

@@ -1142,6 +1142,7 @@ void video_renderer_seek(float position) {
unsigned int video_renderer_listen(void *loop, int id) { unsigned int video_renderer_listen(void *loop, int id) {
g_assert(id >= 0 && id < n_renderers); g_assert(id >= 0 && id < n_renderers);
g_assert (renderer_type[id] && renderer_type[id]->bus);
return (unsigned int) gst_bus_add_watch(renderer_type[id]->bus,(GstBusFunc) return (unsigned int) gst_bus_add_watch(renderer_type[id]->bus,(GstBusFunc)
gstreamer_video_pipeline_bus_callback, (gpointer) loop); gstreamer_video_pipeline_bus_callback, (gpointer) loop);
} }

View File

@@ -118,6 +118,7 @@ static bool new_window_closing_behavior = false;
static bool new_window_closing_behavior = true; static bool new_window_closing_behavior = true;
#endif #endif
static bool close_window; static bool close_window;
static bool full_video_reset = true;
static std::string video_parser = "h264parse"; static std::string video_parser = "h264parse";
static std::string video_decoder = "decodebin"; static std::string video_decoder = "decodebin";
static std::string video_converter = "videoconvert"; static std::string video_converter = "videoconvert";
@@ -541,8 +542,9 @@ static gboolean feedback_callback(gpointer loop) {
if (!nofreeze) { if (!nofreeze) {
close_window = false; /* leave "frozen" window open if reset_video is false */ close_window = false; /* leave "frozen" window open if reset_video is false */
} }
reset_httpd = true; reset_httpd = true;
relaunch_video = true; relaunch_video = true;
full_video_reset = true;
g_main_loop_quit((GMainLoop *) loop); g_main_loop_quit((GMainLoop *) loop);
return TRUE; return TRUE;
} else if (missed_feedback > 2) { } else if (missed_feedback > 2) {
@@ -3249,7 +3251,7 @@ int main (int argc, char *argv[]) {
if (use_audio) { if (use_audio) {
audio_renderer_stop(); audio_renderer_stop();
} }
if (use_video && (close_window || preserve_connections)) { if (use_video && (close_window || preserve_connections || full_video_reset)) {
video_renderer_destroy(); video_renderer_destroy();
if (!preserve_connections) { if (!preserve_connections) {
url.erase(); url.erase();
@@ -3260,6 +3262,7 @@ int main (int argc, char *argv[]) {
video_decoder.c_str(), video_converter.c_str(), videosink.c_str(), video_decoder.c_str(), video_converter.c_str(), videosink.c_str(),
videosink_options.c_str(), fullscreen, video_sync, h265_support, videosink_options.c_str(), fullscreen, video_sync, h265_support,
render_coverart, playbin_version, uri); render_coverart, playbin_version, uri);
full_video_reset = false;
video_renderer_start(); video_renderer_start();
} }
if (reset_httpd) { if (reset_httpd) {