From 2f809eeadd1a9e88192e9278d7df4f9f9ff3e6c8 Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Tue, 22 Apr 2025 14:42:12 -0400 Subject: [PATCH] fix to make sure pts is not less than gst_video_pipeline_base_time --- renderers/video_renderer.c | 5 +++-- renderers/video_renderer.h | 2 +- uxplay.cpp | 12 ++++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 6c59b31..7c6af65 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -452,7 +452,7 @@ bool waiting_for_x11_window() { return false; } -void video_renderer_render_buffer(unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time) { +uint64_t video_renderer_render_buffer(unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time) { GstBuffer *buffer; GstClockTime pts = (GstClockTime) *ntp_time; /*now in nsecs */ //GstClockTimeDiff latency = GST_CLOCK_DIFF(gst_element_get_current_clock_time (renderer->appsrc), pts); @@ -462,7 +462,7 @@ void video_renderer_render_buffer(unsigned char* data, int *data_len, int *nal_c } else { logger_log(logger, LOGGER_ERR, "*** invalid ntp_time < gst_video_pipeline_base_time\n%8.6f ntp_time\n%8.6f base_time", ((double) *ntp_time) / SECOND_IN_NSECS, ((double) gst_video_pipeline_base_time) / SECOND_IN_NSECS); - return; + return (uint64_t) gst_video_pipeline_base_time - pts; } } g_assert(data_len != 0); @@ -499,6 +499,7 @@ void video_renderer_render_buffer(unsigned char* data, int *data_len, int *nal_c } #endif } + return 0; } void video_renderer_flush() { diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 9e2e944..0a34805 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -57,7 +57,7 @@ void video_renderer_seek(float position); void video_renderer_set_start(float position); void video_renderer_resume (); bool video_renderer_is_paused(); -void video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time); +uint64_t video_renderer_render_buffer (unsigned char* data, int *data_len, int *nal_count, uint64_t *ntp_time); void video_renderer_flush (); unsigned int video_renderer_listen(void *loop, int id); void video_renderer_destroy (); diff --git a/uxplay.cpp b/uxplay.cpp index 2ec5708..acdf7f6 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -1785,8 +1785,16 @@ extern "C" void video_process (void *cls, raop_ntp_t *ntp, video_decode_struct * uint64_t local_time = (data->ntp_time_local ? data->ntp_time_local : get_local_time()); remote_clock_offset = local_time - data->ntp_time_remote; } - data->ntp_time_remote = data->ntp_time_remote + remote_clock_offset; - video_renderer_render_buffer(data->data, &(data->data_len), &(data->nal_count), &(data->ntp_time_remote)); + int count = 0; + uint64_t pts_mismatch = 0; + do { + data->ntp_time_remote = data->ntp_time_remote + remote_clock_offset; + pts_mismatch = video_renderer_render_buffer(data->data, &(data->data_len), &(data->nal_count), &(data->ntp_time_remote)); + if (pts_mismatch) { + remote_clock_offset += pts_mismatch; + } + count++; + } while (pts_mismatch && count < 10); } }