67 bool open(
const std::string& filepath,
71 AVPixelFormat src_pixel_format,
72 AVCodecID explicit_codec = AV_CODEC_ID_NONE);
74 std::future<bool> close();
76 [[nodiscard]]
bool is_open()
const {
return m_open.load(std::memory_order_acquire); }
82 bool record(
const std::shared_ptr<Core::Window>& window,
83 const std::string& filepath,
85 AVCodecID codec_id = AV_CODEC_ID_NONE);
87 std::future<bool> stop_recording();
91 return m_observer_id.load(std::memory_order_acquire) != 0;
94 [[nodiscard]] std::shared_ptr<Core::Window>
capture_window()
const {
return m_capture_window; }
100 void write(
const uint8_t*
pixels,
size_t size);
101 void write(std::span<const uint8_t>
pixels);
103 void write(
const std::shared_ptr<Kakshya::TextureContainer>& container,
106 void write(
const std::shared_ptr<Kakshya::VideoStreamContainer>& container,
107 uint64_t frame_index = 0);
109 void write(
const std::shared_ptr<Buffers::TextureBuffer>& buffer);
115 [[nodiscard]] std::string last_error()
const;
125 std::shared_ptr<Buffers::TextureBuffer>
buffer;
130 using WorkItem = std::variant<RawFrame, DownloadCmd, CloseCmd>;
132 static constexpr size_t k_queue_capacity = 512;
133 std::unique_ptr<Memory::LockFreeQueue<WorkItem, k_queue_capacity>>
m_queue;
136 std::atomic<bool> m_open {
false };
137 std::atomic<bool> m_closing {
false };
144 uint32_t m_height {};
145 AVPixelFormat m_src_fmt { AV_PIX_FMT_BGRA };
148 std::atomic<uint32_t> m_observer_id { 0 };
149 std::atomic<bool> m_capture_opened {
false };
151 double m_capture_frame_rate {};
152 AVCodecID m_capture_codec_id { AV_CODEC_ID_NONE };
153 bool m_capture_did_enable {
false };
155 void worker_loop(
const std::string& filepath,
159 AVPixelFormat src_fmt,
162 void set_error(std::string msg);
163 bool post(
const WorkItem& item);