add video_renderer_cycle (for closing expired rendered coverart)

This commit is contained in:
F. Duncanh
2025-09-01 10:37:49 -04:00
parent 6c2844deef
commit 6cc0424bc6
2 changed files with 76 additions and 38 deletions

View File

@@ -469,7 +469,7 @@ void video_renderer_start() {
if (hls_video) {
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);
state_name = gst_element_state_get_name(state);
logger_log(logger, LOGGER_DEBUG, "video renderer_start: state %s", state_name);
return;
}
@@ -477,7 +477,7 @@ void video_renderer_start() {
for (int i = 0; i < n_renderers; i++) {
gst_element_set_state (renderer_type[i]->pipeline, GST_STATE_PAUSED);
gst_element_get_state(renderer_type[i]->pipeline, &state, NULL, 1000 * GST_MSECOND);
state_name= gst_element_state_get_name(state);
state_name = gst_element_state_get_name(state);
logger_log(logger, LOGGER_DEBUG, "video renderer_start: renderer %d %p state %s", i, renderer_type[i], state_name);
}
renderer = NULL;
@@ -507,6 +507,43 @@ bool waiting_for_x11_window() {
return false;
}
/* use this to cycle the jpeg renderer to remove expired coverart when no new coverart has replaced it */
int video_renderer_cycle() {
g_assert(renderer);
GstState state, pending_state, target_state;
GstStateChangeReturn ret;
gst_element_get_state(renderer->pipeline, &state, NULL, 0);
logger_log(logger, LOGGER_DEBUG, "renderer_cycle renderer %p: initial pipeline state is %s", renderer,
gst_element_state_get_name(state));
for (int i = 0 ; i < 2; i++) {
if (i == 0 ) {
target_state = GST_STATE_NULL;
video_renderer_stop();
} else {
target_state = GST_STATE_PLAYING;
gst_element_set_state (renderer->pipeline, target_state);
}
while (state != target_state) {
ret = gst_element_get_state(renderer->pipeline, &state, &pending_state, 100 * GST_MSECOND);
if (ret == GST_STATE_CHANGE_SUCCESS) {
logger_log(logger, LOGGER_DEBUG, "current pipeline state is %s", gst_element_state_get_name(state));
if (pending_state != GST_STATE_VOID_PENDING) {
logger_log(logger, LOGGER_DEBUG, "pending pipeline state is %s", gst_element_state_get_name(pending_state));
}
} else if (ret == GST_STATE_CHANGE_FAILURE) {
logger_log(logger, LOGGER_ERR, "pipeline %s: state change to %s failed", renderer->codec, gst_element_state_get_name(target_state));
return -1;
} else if (ret == GST_STATE_CHANGE_ASYNC) {
logger_log(logger, LOGGER_DEBUG, "state change to %s is asynchronous, waiting for completion ...",
gst_element_state_get_name(target_state));
}
}
}
return 0;
}
void video_renderer_display_jpeg(const void *data, int *data_len) {
GstBuffer *buffer;
if (type_jpeg == -1) {

View File

@@ -57,6 +57,7 @@ void video_renderer_pause ();
void video_renderer_seek(float position);
void video_renderer_set_start(float position);
void video_renderer_resume ();
int video_renderer_cycle ();
bool video_renderer_is_paused();
uint64_t video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time);
void video_renderer_display_jpeg(const void *data, int *data_len);