From b8518932ad15c08e03369d1d16c19b021184aab7 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Thu, 5 Feb 2026 18:19:46 -0500 Subject: [PATCH] overlay artist:title metadata on coverart in -ca audio mode --- renderers/video_renderer.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 4750adc..46f18c4 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -77,7 +77,7 @@ typedef enum { #define NCODECS 3 /* renderers for h264,h265, and jpeg images */ struct video_renderer_s { - GstElement *appsrc, *pipeline; + GstElement *appsrc, *pipeline, *textsrc; GstBus *bus; const char *codec; bool autovideo; @@ -278,6 +278,7 @@ 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]->textsrc = NULL; renderer_type[i]->uri = NULL; renderer_type[i]->eos = FALSE; if (hls_video) { @@ -350,7 +351,7 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, video g_string_append(launch, " ! "); g_string_append(launch, "videoscale ! "); if (jpeg_pipeline) { - g_string_append(launch, " imagefreeze allow-replace=TRUE ! "); + g_string_append(launch, " imagefreeze allow-replace=TRUE ! textoverlay name=metadata_overlay ! "); } g_string_append(launch, videosink); g_string_append(launch, " name="); @@ -402,6 +403,10 @@ void video_renderer_init(logger_t *render_logger, const char *server_name, video g_string_free(launch, TRUE); gst_caps_unref(caps); gst_object_unref(clock); + if (jpeg_pipeline) { + renderer_type[i]->textsrc = gst_bin_get_by_name(GST_BIN(renderer_type[i]->pipeline), "metadata_overlay"); + g_object_set(G_OBJECT(renderer_type[i]->textsrc), "text", "", "shaded-background", TRUE, "font-desc", "Sans, 16", NULL); + } } #ifdef X_DISPLAY_FIX use_x11 = (strstr(videosink, "xvimagesink") || strstr(videosink, "ximagesink") || auto_videosink); @@ -664,10 +669,23 @@ void video_renderer_set_device_model(const char *model, const char *name) { } void video_renderer_set_track_metadata(const char *title, const char *artist, const char *album) { - // Track metadata display not supported in GStreamer renderer - (void)title; - (void)artist; - (void)album; + // Track metadata display superimposed on coverart is now supported in GStreamer renderer + GString *metadata = g_string_new(""); + if (artist) { + g_string_append(metadata, artist); + } + if (artist && title) { + g_string_append(metadata, ": "); + } + if (title) { + g_string_append(metadata, "\""); + g_string_append(metadata, title); + g_string_append(metadata, "\""); + } + if (renderer && renderer->textsrc && (artist || title)) { + g_object_set(G_OBJECT(renderer->textsrc), "text", metadata->str, NULL); + } + g_string_free(metadata, TRUE); } static void video_renderer_destroy_instance(video_renderer_t *renderer) { @@ -691,6 +709,10 @@ static void video_renderer_destroy_instance(video_renderer_t *renderer) { gst_object_unref (renderer->appsrc); renderer->appsrc = NULL; } + if (renderer->textsrc) { + gst_object_unref (renderer->textsrc); + renderer->textsrc = NULL; + } gst_object_unref(renderer->bus); gst_object_unref(renderer->pipeline); #ifdef X_DISPLAY_FIX