+ if (fifo->timeshift) {
+ int64_t now = av_gettime_relative();
+ int64_t elapsed = 0;
+ FifoMessage msg = {FIFO_NOOP};
+ do {
+ int64_t delay = av_gettime_relative() - now;
+ if (delay < 0) { // Discontinuity?
+ delay = 10000;
+ now = av_gettime_relative();
+ } else {
+ now += delay;
+ }
+ atomic_fetch_add_explicit(&fifo->queue_duration, delay, memory_order_relaxed);
+ elapsed += delay;
+ if (elapsed > fifo->timeshift)
+ break;
+ av_usleep(10000);
+ ret = av_thread_message_queue_send(fifo->queue, &msg, AV_THREAD_MESSAGE_NONBLOCK);
+ } while (ret >= 0 || ret == AVERROR(EAGAIN));
+ atomic_store(&fifo->queue_duration, INT64_MAX);
+ }