32 using clock = std::chrono::steady_clock;
34 void install(AVFormatContext& ctx)
noexcept
36 ctx.interrupt_callback.callback = &LibavInterrupt::on_interrupt;
37 ctx.interrupt_callback.opaque =
this;
40 void arm(std::chrono::milliseconds timeout)
noexcept
43 (clock::now() + timeout).time_since_epoch().count(), std::memory_order_release);
46 void disarm()
noexcept { m_deadline.store(none, std::memory_order_release); }
49 void abort() noexcept { m_aborted.store(
true, std::memory_order_release); }
53 m_aborted.store(
false, std::memory_order_release);
57 bool aborted() const noexcept {
return m_aborted.load(std::memory_order_acquire); }
59 bool expired() const noexcept
64 const auto deadline = m_deadline.load(std::memory_order_acquire);
65 return deadline != none && clock::now().time_since_epoch().count() >= deadline;
69 static constexpr int64_t none = 0;
71 static int on_interrupt(
void* opaque)
noexcept
73 return static_cast<const LibavInterrupt*
>(opaque)->expired() ? 1 : 0;
76 std::atomic<int64_t> m_deadline{none};
77 std::atomic_bool m_aborted{};