Bound persistent presentation lag and report catch-up decisions

This commit is contained in:
evgeny committed 2026-10-20 00:15:42 +02:00
1 parent 8c826fa2e7
commit 52d9a347c3
3 files changed
+14 -7

No files matched your search

+9 -2
View File
@@ -50,6 +50,11 @@ void call_video_playout_log_event(const struct call_video_playout_event *event)
(unsigned long long)p->call_id, (long long)f->pts_us, (long long)p->pending.pts_us, p->awaiting,
(long long)now, (long long)p->selected_us); return;
}
if (event->kind == CALL_VIDEO_LOG_RECOVERY) {
DEBUG_INFO(DEBUG_CATEGORY_CALL, "video display catchup call=%llu lag_us=%lld recovered_us=%lld window_us=%lld queued=%u reserve=%u; decoded presentation only",
(unsigned long long)p->call_id, (long long)-p->pending_av, (long long)(p->recovery_lag + p->pending_av),
(long long)(now - p->recovery_us), p->queued, p->reserve); return;
}
DEBUG_DEBUG(DEBUG_CATEGORY_CALL,
"video playout call=%llu interval_us=%lld shown=%u speed_ppm=%u drop_order=%u drop_display=%u "
"cadence_us=%lld..%lld gap_pts_us=%lld gap_rx_us=%lld gap_dispatch_us=%lld "
@@ -112,10 +117,12 @@ enum call_video_playout_action call_video_playout_poll(struct call_video_playout
// (например, вход 60 fps и экран 60 Hz). Небольшие паузы сохраняют все кадры.
if (-av <= working_lag || queued <= target_frames + 1) {
p->recovery_us = 0; p->skipping = 0;
} else if (-av > working_lag + 100000) {
} else {
if (!p->recovery_us) { p->recovery_us = now; p->recovery_lag = -av; }
else if (now - p->recovery_us >= 500000) {
if (p->recovery_lag + av < f->interval_us / 4) p->skipping = 1;
if (p->recovery_lag + av < f->interval_us / 4 && !p->skipping) {
p->skipping = 1; p->pending_av = av; log_event(p, CALL_VIDEO_LOG_RECOVERY, f, now);
}
p->recovery_us = now; p->recovery_lag = -av;
}
}
+1 -1
View File
@@ -43,7 +43,7 @@ struct call_video_playout {
void *log_arg;
};
enum call_video_playout_event_kind {
CALL_VIDEO_LOG_REPORT, CALL_VIDEO_LOG_CLOCK, CALL_VIDEO_LOG_ORDER, CALL_VIDEO_LOG_GAP, CALL_VIDEO_LOG_ACK
CALL_VIDEO_LOG_REPORT, CALL_VIDEO_LOG_CLOCK, CALL_VIDEO_LOG_ORDER, CALL_VIDEO_LOG_GAP, CALL_VIDEO_LOG_ACK, CALL_VIDEO_LOG_RECOVERY
};
struct call_video_playout_event {
enum call_video_playout_event_kind kind;