63 AVFramePointer newFrame()
noexcept;
65 void enqueue_decoding_error(AVFrame* f);
66 void enqueue(AVFrame* f);
67 AVFrame* dequeue()
noexcept;
68 AVFrame* dequeue_one()
noexcept;
69 AVFrame* discard_and_dequeue()
noexcept;
70 AVFrame* discard_and_dequeue_one()
noexcept;
79 void set_discard_before(int64_t pts)
noexcept;
80 void release(AVFrame* frame)
noexcept;
87 std::size_t size() const noexcept {
return available.size_approx(); }
92 void watch(AVFrame* f)
noexcept { m_watched = f; }
93 AVFrame* watched() const noexcept {
return m_watched; }
96 AVFramePointer newFrameImpl() noexcept;
98 ossia::mpmc_queue<AVFrame*> available;
99 ossia::mpmc_queue<AVFrame*> released;
108 bool pendingDiscard(Discard& d)
const noexcept;
109 static bool before(
const AVFrame& f,
const Discard& d)
noexcept;
110 template <
typename Dequeue>
111 AVFrame* dequeueDiscarding(
const Dequeue& dequeue)
noexcept;
113 std::vector<AVFrame*> m_decodeThreadFrameBuffer;
114 AVFrame* m_watched{};
118 std::atomic<uint32_t> m_discardSequence{};
119 std::atomic<int64_t> m_discardPts{};
120 std::atomic_int m_discardGeneration{};
121 std::atomic<uint32_t> m_discardDone{};
122 std::atomic_int m_generation{};