diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 023e8c6..fbe2540 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -85,6 +85,7 @@ struct video_renderer_s { const char *codec; bool autovideo; int id; + char *uri; gboolean terminate; gint64 duration; gint buffering_level; @@ -282,7 +283,10 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, video renderer_type[i]->id = i; renderer_type[i]->bus = NULL; renderer_type[i]->appsrc = NULL; + renderer_type[i]->uri = NULL; if (hls_video) { + renderer_type[i]->uri = (char *) calloc(strlen(uri) + 1, sizeof(char)); + memcpy(renderer_type[i]->uri, uri, strlen(uri)); /* use playbin3 to play HLS video: replace "playbin3" by "playbin" to use playbin2 */ switch (playbin_version) { case 2: @@ -475,12 +479,12 @@ void video_renderer_resume() { } } -void video_renderer_start( void * opaque, const char * uri) { +void video_renderer_start( void * opaque) { GstState state; const gchar *state_name; if (hls_video) { raop = (raop_t *) opaque; - g_object_set (G_OBJECT (renderer->pipeline), "uri", uri, NULL); + g_object_set (G_OBJECT (renderer->pipeline), "uri", renderer->uri, NULL); gst_element_set_state (renderer->pipeline, GST_STATE_PAUSED); gst_element_get_state(renderer->pipeline, &state, NULL, 1000 * GST_MSECOND); state_name = gst_element_state_get_name(state); @@ -689,6 +693,9 @@ static void video_renderer_destroy_instance(video_renderer_t *renderer) { renderer->gst_window = NULL; } #endif + if (renderer->uri) { + free(renderer->uri); + } free (renderer); renderer = NULL; logger_log(logger, LOGGER_DEBUG,"renderer destroyed\n"); @@ -857,10 +864,12 @@ static gboolean gstreamer_video_pipeline_bus_callback(GstBus *bus, GstMessage *m if (renderer_type[type]->appsrc) { gst_app_src_end_of_stream (GST_APP_SRC(renderer_type[type]->appsrc)); } - gst_bus_set_flushing(bus, TRUE); - gst_element_set_state (renderer_type[type]->pipeline, GST_STATE_READY); - renderer_type[type]->terminate = TRUE; - g_main_loop_quit( (GMainLoop *) loop); + if (!hls_video) { + gst_bus_set_flushing(bus, TRUE); + gst_element_set_state (renderer_type[type]->pipeline, GST_STATE_READY); + renderer_type[type]->terminate = TRUE; + g_main_loop_quit( (GMainLoop *) loop); + } break; } case GST_MESSAGE_EOS: diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index f8c2ce9..9458250 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -51,7 +51,7 @@ typedef struct video_renderer_s video_renderer_t; const char *decoder, const char *converter, const char *videosink, const char *videosink_options, bool initial_fullscreen, bool video_sync, bool h265_support, bool coverart_support, guint playbin_version, const char *uri); -void video_renderer_start (void *raop, const char *uri); +void video_renderer_start (void *raop); void video_renderer_stop (); void video_renderer_pause (); void video_renderer_hls_ready (); diff --git a/uxplay.cpp b/uxplay.cpp index c301c76..c06e23e 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -2994,7 +2994,7 @@ int main (int argc, char *argv[]) { video_decoder.c_str(), video_converter.c_str(), videosink.c_str(), videosink_options.c_str(), fullscreen, video_sync, h265_support, render_coverart, playbin_version, NULL); - video_renderer_start(NULL, NULL); + video_renderer_start(NULL); #ifdef __OpenBSD__ } else { if (pledge("stdio rpath wpath cpath inet unix prot_exec", NULL) == -1) { @@ -3096,7 +3096,7 @@ int main (int argc, char *argv[]) { video_decoder.c_str(), video_converter.c_str(), videosink.c_str(), videosink_options.c_str(), fullscreen, video_sync, h265_support, render_coverart, playbin_version, uri); - video_renderer_start((void *) raop, uri); + video_renderer_start((void *) raop); } if (reset_httpd) { unsigned short port = raop_get_port(raop);