store uri in renderer_s, don't stop main_loop if hls gstreamer error

This commit is contained in:
F. Duncanh
2025-11-30 11:36:40 -05:00
parent 1099b94f05
commit ef025dfd0e
3 changed files with 18 additions and 9 deletions

View File

@@ -85,6 +85,7 @@ struct video_renderer_s {
const char *codec; const char *codec;
bool autovideo; bool autovideo;
int id; int id;
char *uri;
gboolean terminate; gboolean terminate;
gint64 duration; gint64 duration;
gint buffering_level; 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]->id = i;
renderer_type[i]->bus = NULL; renderer_type[i]->bus = NULL;
renderer_type[i]->appsrc = NULL; renderer_type[i]->appsrc = NULL;
renderer_type[i]->uri = NULL;
if (hls_video) { 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 */ /* use playbin3 to play HLS video: replace "playbin3" by "playbin" to use playbin2 */
switch (playbin_version) { switch (playbin_version) {
case 2: 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; GstState state;
const gchar *state_name; const gchar *state_name;
if (hls_video) { if (hls_video) {
raop = (raop_t *) opaque; 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_set_state (renderer->pipeline, GST_STATE_PAUSED);
gst_element_get_state(renderer->pipeline, &state, NULL, 1000 * GST_MSECOND); gst_element_get_state(renderer->pipeline, &state, NULL, 1000 * GST_MSECOND);
state_name = gst_element_state_get_name(state); 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; renderer->gst_window = NULL;
} }
#endif #endif
if (renderer->uri) {
free(renderer->uri);
}
free (renderer); free (renderer);
renderer = NULL; renderer = NULL;
logger_log(logger, LOGGER_DEBUG,"renderer destroyed\n"); 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) { if (renderer_type[type]->appsrc) {
gst_app_src_end_of_stream (GST_APP_SRC(renderer_type[type]->appsrc)); gst_app_src_end_of_stream (GST_APP_SRC(renderer_type[type]->appsrc));
} }
gst_bus_set_flushing(bus, TRUE); if (!hls_video) {
gst_element_set_state (renderer_type[type]->pipeline, GST_STATE_READY); gst_bus_set_flushing(bus, TRUE);
renderer_type[type]->terminate = TRUE; gst_element_set_state (renderer_type[type]->pipeline, GST_STATE_READY);
g_main_loop_quit( (GMainLoop *) loop); renderer_type[type]->terminate = TRUE;
g_main_loop_quit( (GMainLoop *) loop);
}
break; break;
} }
case GST_MESSAGE_EOS: case GST_MESSAGE_EOS:

View File

@@ -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, 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, bool initial_fullscreen, bool video_sync, bool h265_support, bool coverart_support,
guint playbin_version, const char *uri); 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_stop ();
void video_renderer_pause (); void video_renderer_pause ();
void video_renderer_hls_ready (); void video_renderer_hls_ready ();

View File

@@ -2994,7 +2994,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, NULL); render_coverart, playbin_version, NULL);
video_renderer_start(NULL, NULL); video_renderer_start(NULL);
#ifdef __OpenBSD__ #ifdef __OpenBSD__
} else { } else {
if (pledge("stdio rpath wpath cpath inet unix prot_exec", NULL) == -1) { 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(), 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);
video_renderer_start((void *) raop, uri); video_renderer_start((void *) raop);
} }
if (reset_httpd) { if (reset_httpd) {
unsigned short port = raop_get_port(raop); unsigned short port = raop_get_port(raop);