overlay artist:title metadata on coverart in -ca audio mode

This commit is contained in:
F. Duncanh
2026-02-05 18:19:46 -05:00
parent 1b84706462
commit b8518932ad

View File

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