/** * @file src/platform/macos/av_img_t.h * @brief Declarations for AV image types on macOS. */ #pragma once // platform includes #include #include // local includes #include "src/platform/common.h" namespace platf { struct av_sample_buf_t { CMSampleBufferRef buf; explicit av_sample_buf_t(CMSampleBufferRef buf): buf((CMSampleBufferRef) CFRetain(buf)) { } ~av_sample_buf_t() { if (buf != nullptr) { CFRelease(buf); } } }; struct av_pixel_buf_t { CVPixelBufferRef buf; // Constructor explicit av_pixel_buf_t(CMSampleBufferRef sb): buf( CMSampleBufferGetImageBuffer(sb) ) { CVPixelBufferLockBaseAddress(buf, kCVPixelBufferLock_ReadOnly); } [[nodiscard]] uint8_t *data() const { return static_cast(CVPixelBufferGetBaseAddress(buf)); } // Destructor ~av_pixel_buf_t() { if (buf != nullptr) { CVPixelBufferUnlockBaseAddress(buf, kCVPixelBufferLock_ReadOnly); } } }; struct av_img_t: img_t { std::shared_ptr sample_buffer; std::shared_ptr pixel_buffer; }; struct temp_retain_av_img_t { std::shared_ptr sample_buffer; std::shared_ptr pixel_buffer; uint8_t *data; temp_retain_av_img_t( std::shared_ptr sb, std::shared_ptr pb, uint8_t *dt ): sample_buffer(std::move(sb)), pixel_buffer(std::move(pb)), data(dt) { } }; } // namespace platf