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;
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:

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,
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 ();

View File

@@ -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);