68 bool open(
const std::string& filepath,
72 AVPixelFormat src_pixel_format,
73 AVCodecID explicit_codec = AV_CODEC_ID_NONE);
75 std::future<bool> close();
77 [[nodiscard]]
bool is_open()
const {
return m_open.load(std::memory_order_acquire); }
83 bool record(
const std::shared_ptr<Core::Window>& window,
84 const std::string& filepath,
86 AVCodecID codec_id = AV_CODEC_ID_NONE);
88 std::future<bool> stop_recording();
92 return m_observer_id.load(std::memory_order_acquire) != 0;
95 [[nodiscard]] std::shared_ptr<Core::Window>
capture_window()
const {
return m_capture_window; }
101 void write(
const uint8_t*
pixels,
size_t size);
102 void write(std::span<const uint8_t>
pixels);
104 void write(
const std::shared_ptr<Kakshya::TextureContainer>& container,
107 void write(
const std::shared_ptr<Kakshya::VideoStreamContainer>& container,
108 uint64_t frame_index = 0);
110 void write(
const std::shared_ptr<Buffers::TextureBuffer>& buffer);
116 [[nodiscard]] std::string last_error()
const;
126 std::shared_ptr<Buffers::TextureBuffer>
buffer;
131 using WorkItem = std::variant<RawFrame, DownloadCmd, CloseCmd>;
133 static constexpr size_t k_queue_capacity = 512;
134 std::unique_ptr<Memory::LockFreeQueue<WorkItem, k_queue_capacity>>
m_queue;
137 std::atomic<bool> m_open {
false };
138 std::atomic<bool> m_closing {
false };
145 uint32_t m_height {};
146 AVPixelFormat m_src_fmt { AV_PIX_FMT_BGRA };
150 std::atomic<uint32_t> m_observer_id { 0 };
151 std::atomic<bool> m_capture_opened {
false };
153 double m_capture_frame_rate {};
154 AVCodecID m_capture_codec_id { AV_CODEC_ID_NONE };
155 bool m_capture_did_enable {
false };
157 void worker_loop(
const std::string& filepath,
161 AVPixelFormat src_fmt,
164 void set_error(std::string msg);
165 bool post(
const WorkItem& item);