From 3e1d83d7d68a63c5df7b2ad1b8747c9b0adfdd67 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Thu, 7 Aug 2025 16:14:18 -0400 Subject: [PATCH] cleanup in video_renderer.c --- renderers/video_renderer.c | 27 +++++++++++++++++---------- uxplay.cpp | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 1ba220f..4086312 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -472,7 +472,7 @@ void video_renderer_start() { gst_element_set_state (renderer_type[i]->pipeline, GST_STATE_PAUSED); gst_element_get_state(renderer_type[i]->pipeline, &state, NULL, 1000 * GST_MSECOND); state_name= gst_element_state_get_name(state); - logger_log(logger, LOGGER_DEBUG, "video renderer_start: renderer %d state %s", i, state_name); + logger_log(logger, LOGGER_DEBUG, "video renderer_start: renderer %d %p state %s", i, renderer_type[i], state_name); } renderer = NULL; first_packet = true; @@ -537,6 +537,10 @@ uint64_t video_renderer_render_buffer(unsigned char* data, int *data_len, int *n logger_log(logger, LOGGER_INFO, "Begin streaming to GStreamer video pipeline"); first_packet = false; } + if (!renderer || !(renderer->appsrc)) { + logger_log(logger, LOGGER_DEBUG, "*** no video renderer found"); + return 0; + } buffer = gst_buffer_new_allocate(NULL, *data_len, NULL); g_assert(buffer != NULL); //g_print("video latency %8.6f\n", (double) latency / SECOND_IN_NSECS); @@ -582,21 +586,23 @@ static void video_renderer_destroy_instance(video_renderer_t *renderer) { GstState state; GstStateChangeReturn ret; gst_element_get_state(renderer->pipeline, &state, NULL, 100 * GST_MSECOND); - logger_log(logger, LOGGER_DEBUG,"pipeline state is %s", gst_element_state_get_name(state)); + logger_log(logger, LOGGER_DEBUG,"pipeline state is %s", gst_element_state_get_name(state)); if (state != GST_STATE_NULL) { if (!hls_video) { gst_app_src_end_of_stream (GST_APP_SRC(renderer->appsrc)); } ret = gst_element_set_state (renderer->pipeline, GST_STATE_NULL); - logger_log(logger, LOGGER_DEBUG,"pipeline_state_change_return: %s", - gst_element_state_change_return_get_name(ret)); - gst_element_get_state(renderer->pipeline, NULL, NULL, 1000 * GST_MSECOND); + logger_log(logger, LOGGER_DEBUG,"pipeline_state_change_return: %s", + gst_element_state_change_return_get_name(ret)); + gst_element_get_state(renderer->pipeline, &state, NULL, 1000 * GST_MSECOND); + logger_log(logger, LOGGER_DEBUG,"pipeline state is %s", gst_element_state_get_name(state)); + } + if (renderer->appsrc) { + gst_object_unref (renderer->appsrc); + renderer->appsrc = NULL; } gst_object_unref(renderer->bus); - if (renderer->appsrc) { - gst_object_unref (renderer->appsrc); - } - gst_object_unref (renderer->pipeline); + gst_object_unref(renderer->pipeline); #ifdef X_DISPLAY_FIX if (renderer->gst_window) { free(renderer->gst_window); @@ -605,6 +611,7 @@ static void video_renderer_destroy_instance(video_renderer_t *renderer) { #endif free (renderer); renderer = NULL; + logger_log(logger, LOGGER_DEBUG,"renderer destroyed\n"); } } @@ -908,7 +915,7 @@ int video_renderer_choose_codec (bool video_is_jpeg, bool video_is_h265) { logger_log(logger, LOGGER_INFO, "*** video format is h265 high definition (HD/4K) video %dx%d", width, height); } /* destroy unused renderers */ - for (int i = 1; i < n_renderers; i++) { + for (int i = 0; i < n_renderers; i++) { if (renderer_type[i] == renderer) { continue; } diff --git a/uxplay.cpp b/uxplay.cpp index c3b41fb..c276103 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -2632,7 +2632,7 @@ int main (int argc, char *argv[]) { url.erase(); raop_remove_known_connections(raop); } - const char *uri = (url.empty() ? NULL : url.c_str()); + const char *uri = (url.empty() ? NULL : url.c_str()); video_renderer_init(render_logger, server_name.c_str(), videoflip, video_parser.c_str(), video_decoder.c_str(), video_converter.c_str(), videosink.c_str(), videosink_options.c_str(), fullscreen, video_sync, h265_support, playbin_version, uri);