#pragma once
#include <cstdint>
#include <utility>
namespace warb_abi {
using HRESULT = int32_t;
using ULONG = uint32_t;
using Boolean = bool;
struct GUID {
uint32_t Data1;
uint16_t Data2;
uint16_t Data3;
uint8_t Data4[8];
};
using REFIID = const GUID&;
inline constexpr HRESULT S_OK = 0x00000000;
inline constexpr HRESULT S_FALSE = 0x00000001;
inline constexpr HRESULT E_NOTIMPL = (HRESULT)0x80004001;
inline constexpr HRESULT E_NOINTERFACE = (HRESULT)0x80004002;
inline constexpr HRESULT E_POINTER = (HRESULT)0x80004003;
inline constexpr HRESULT E_FAIL = (HRESULT)0x80004005;
inline constexpr HRESULT E_UNEXPECTED = (HRESULT)0x8000FFFF;
inline constexpr HRESULT E_OUTOFMEMORY = (HRESULT)0x8007000E;
inline constexpr HRESULT E_INVALIDARG = (HRESULT)0x80070057;
inline constexpr bool SUCCEEDED(HRESULT hr) { return hr >= 0; }
inline constexpr bool FAILED(HRESULT hr) { return hr < 0; }
inline constexpr GUID IID_IUnknown = {
0x00000000, 0x0000, 0x0000,
{ 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 }
};
#define WARB_FOURCC(a,b,c,d) ( \
(static_cast<uint32_t>(static_cast<uint8_t>(a)) << 24) | \
(static_cast<uint32_t>(static_cast<uint8_t>(b)) << 16) | \
(static_cast<uint32_t>(static_cast<uint8_t>(c)) << 8) | \
static_cast<uint32_t>(static_cast<uint8_t>(d)))
enum BlackmagicRawPipeline : uint32_t {
blackmagicRawPipelineCPU = WARB_FOURCC('c','p','u','b'),
blackmagicRawPipelineCUDA = WARB_FOURCC('c','u','d','a'),
blackmagicRawPipelineMetal = WARB_FOURCC('m','e','t','l'),
blackmagicRawPipelineOpenCL = WARB_FOURCC('o','p','c','l'),
};
enum BlackmagicRawInterop : uint32_t {
blackmagicRawInteropNone = WARB_FOURCC('n','o','n','e'),
blackmagicRawInteropOpenGL = WARB_FOURCC('o','p','g','l'),
};
enum BlackmagicRawResolutionScale : uint32_t {
blackmagicRawResolutionScaleFull = WARB_FOURCC('f','u','l','l'),
blackmagicRawResolutionScaleHalf = WARB_FOURCC('h','a','l','f'),
blackmagicRawResolutionScaleQuarter = WARB_FOURCC('q','r','t','r'),
blackmagicRawResolutionScaleEighth = WARB_FOURCC('e','i','t','h'),
};
enum BlackmagicRawResourceType : uint32_t {
blackmagicRawResourceTypeBufferCPU = WARB_FOURCC('c','p','u','b'),
blackmagicRawResourceTypeBufferMetal = WARB_FOURCC('m','e','t','b'),
blackmagicRawResourceTypeBufferCUDA = WARB_FOURCC('c','u','d','b'),
blackmagicRawResourceTypeBufferOpenCL = WARB_FOURCC('o','c','l','b'),
};
enum BlackmagicRawResourceFormat : uint32_t {
blackmagicRawResourceFormatRGBAU8 = WARB_FOURCC('r','g','b','a'),
blackmagicRawResourceFormatBGRAU8 = WARB_FOURCC('b','g','r','a'),
blackmagicRawResourceFormatRGBU16 = WARB_FOURCC('1','6','i','l'),
blackmagicRawResourceFormatRGBAU16 = WARB_FOURCC('1','6','a','l'),
blackmagicRawResourceFormatBGRAU16 = WARB_FOURCC('1','6','l','a'),
blackmagicRawResourceFormatRGBU16Planar = WARB_FOURCC('1','6','p','l'),
blackmagicRawResourceFormatRGBF32 = WARB_FOURCC('f','3','2','s'),
blackmagicRawResourceFormatRGBAF32 = WARB_FOURCC('f','3','2','l'),
blackmagicRawResourceFormatBGRAF32 = WARB_FOURCC('f','3','2','a'),
blackmagicRawResourceFormatRGBF32Planar = WARB_FOURCC('f','3','2','p'),
blackmagicRawResourceFormatRGBF16 = WARB_FOURCC('f','1','6','s'),
blackmagicRawResourceFormatRGBAF16 = WARB_FOURCC('f','1','6','l'),
blackmagicRawResourceFormatBGRAF16 = WARB_FOURCC('f','1','6','a'),
blackmagicRawResourceFormatRGBF16Planar = WARB_FOURCC('f','1','6','p'),
};
class IBlackmagicRawClipProcessingAttributes;
class IBlackmagicRawFrameProcessingAttributes;
class IBlackmagicRawClipGeometry;
class IBlackmagicRawPipelineDevice;
class IBlackmagicRawPipelineIterator;
class IBlackmagicRawPipelineDeviceIterator;
class IBlackmagicRawMetadataIterator;
class IBlackmagicRaw;
class IBlackmagicRawClip;
class IBlackmagicRawFrame;
class IBlackmagicRawProcessedImage;
class IBlackmagicRawJob;
class IBlackmagicRawCallback;
class IUnknown {
public:
virtual HRESULT QueryInterface(REFIID iid, void** ppv) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
};
class IBlackmagicRawFactory : public IUnknown {
public:
virtual HRESULT CreateCodec(IBlackmagicRaw** codec) = 0;
virtual HRESULT CreatePipelineIterator(BlackmagicRawInterop interop,
IBlackmagicRawPipelineIterator** pipelineIterator) = 0;
virtual HRESULT CreatePipelineDeviceIterator(BlackmagicRawPipeline pipeline,
BlackmagicRawInterop interop,
IBlackmagicRawPipelineDeviceIterator** deviceIterator) = 0;
virtual HRESULT CreateClipGeometry(IBlackmagicRawClipGeometry** geometry) = 0;
};
class IBlackmagicRaw : public IUnknown {
public:
virtual HRESULT OpenClip(const char* fileName, IBlackmagicRawClip** clip) = 0;
virtual HRESULT OpenClipWithGeometry(const char* fileName,
IBlackmagicRawClipGeometry* geometry,
IBlackmagicRawClip** clip) = 0;
virtual HRESULT SetCallback(IBlackmagicRawCallback* callback) = 0;
virtual HRESULT PreparePipeline(BlackmagicRawPipeline pipeline,
void* pipelineContext,
void* pipelineCommandQueue,
void* userData) = 0;
virtual HRESULT PreparePipelineForDevice(IBlackmagicRawPipelineDevice* pipelineDevice,
void* userData) = 0;
virtual HRESULT FlushJobs() = 0;
};
class IBlackmagicRawClip : public IUnknown {
public:
virtual HRESULT GetWidth(uint32_t* width) = 0;
virtual HRESULT GetHeight(uint32_t* height) = 0;
virtual HRESULT GetFrameRate(float* frameRate) = 0;
virtual HRESULT GetFrameCount(uint64_t* frameCount) = 0;
virtual HRESULT GetTimecodeForFrame(uint64_t frameIndex, const char** timecode) = 0;
virtual HRESULT GetMetadataIterator(IBlackmagicRawMetadataIterator** iterator) = 0;
virtual HRESULT GetMetadata(const char* key, void* value ) = 0;
virtual HRESULT SetMetadata(const char* key, void* value ) = 0;
virtual HRESULT GetCameraType(const char** cameraType) = 0;
virtual HRESULT CloneClipProcessingAttributes(IBlackmagicRawClipProcessingAttributes** clipProcessingAttributes) = 0;
virtual HRESULT GetMulticardFileCount(uint32_t* multicardFileCount) = 0;
virtual HRESULT IsMulticardFilePresent(uint32_t cardIndex, Boolean* present) = 0;
virtual HRESULT GetSidecarFileAttached(Boolean* attached) = 0;
virtual HRESULT SaveSidecarFile() = 0;
virtual HRESULT ReloadSidecarFile() = 0;
virtual HRESULT CreateJobReadFrame(uint64_t frameIndex, IBlackmagicRawJob** job) = 0;
virtual HRESULT CreateJobTrim(const char* fileName,
uint64_t frameIndex, uint64_t frameCount,
IBlackmagicRawClipProcessingAttributes* clipProcessingAttributes,
IBlackmagicRawFrameProcessingAttributes** frameProcessingAttributes,
IBlackmagicRawJob** job) = 0;
virtual HRESULT CloneWithGeometry(IBlackmagicRawClipGeometry* geometry, IBlackmagicRawClip** clip) = 0;
};
class IBlackmagicRawFrame : public IUnknown {
public:
virtual HRESULT GetFrameIndex(uint64_t* frameIndex) = 0;
virtual HRESULT GetTimecode(const char** timecode) = 0;
virtual HRESULT GetMetadataIterator(IBlackmagicRawMetadataIterator** iterator) = 0;
virtual HRESULT GetMetadata(const char* key, void* value ) = 0;
virtual HRESULT SetMetadata(const char* key, void* value ) = 0;
virtual HRESULT CloneFrameProcessingAttributes(IBlackmagicRawFrameProcessingAttributes** frameProcessingAttributes) = 0;
virtual HRESULT SetResolutionScale(BlackmagicRawResolutionScale resolutionScale) = 0;
virtual HRESULT GetResolutionScale(BlackmagicRawResolutionScale* resolutionScale) = 0;
virtual HRESULT SetResourceFormat(BlackmagicRawResourceFormat resourceFormat) = 0;
virtual HRESULT GetResourceFormat(BlackmagicRawResourceFormat* resourceFormat) = 0;
virtual HRESULT GetSensorRate(float* sensorRate) = 0;
virtual HRESULT CreateJobDecodeAndProcessFrame(IBlackmagicRawClipProcessingAttributes* clipProcessingAttributes,
IBlackmagicRawFrameProcessingAttributes* frameProcessingAttributes,
IBlackmagicRawJob** job) = 0;
};
class IBlackmagicRawProcessedImage : public IUnknown {
public:
virtual HRESULT GetWidth(uint32_t* width) = 0;
virtual HRESULT GetHeight(uint32_t* height) = 0;
virtual HRESULT GetResource(void** resource) = 0;
virtual HRESULT GetResourceType(BlackmagicRawResourceType* type) = 0;
virtual HRESULT GetResourceFormat(BlackmagicRawResourceFormat* format) = 0;
virtual HRESULT GetResourceSizeBytes(uint32_t* sizeBytes) = 0;
virtual HRESULT GetResourceContextAndCommandQueue(void** context, void** commandQueue) = 0;
};
class IBlackmagicRawJob : public IUnknown {
public:
virtual HRESULT Submit() = 0;
virtual HRESULT Abort() = 0;
virtual HRESULT SetUserData(void* userData) = 0;
virtual HRESULT GetUserData(void** userData) = 0;
};
class IBlackmagicRawCallback : public IUnknown {
public:
virtual void ReadComplete(IBlackmagicRawJob* job, HRESULT result, IBlackmagicRawFrame* frame) = 0;
virtual void DecodeComplete(IBlackmagicRawJob* job, HRESULT result) = 0;
virtual void ProcessComplete(IBlackmagicRawJob* job, HRESULT result,
IBlackmagicRawProcessedImage* processedImage) = 0;
virtual void TrimProgress(IBlackmagicRawJob* job, float progress) = 0;
virtual void TrimComplete(IBlackmagicRawJob* job, HRESULT result) = 0;
virtual void SidecarMetadataParseWarning(IBlackmagicRawClip* clip, const char* fileName,
uint32_t lineNumber, const char* info) = 0;
virtual void SidecarMetadataParseError(IBlackmagicRawClip* clip, const char* fileName,
uint32_t lineNumber, const char* info) = 0;
virtual void PreparePipelineComplete(void* userData, HRESULT result) = 0;
};
using CreateBlackmagicRawFactoryInstanceFn = IBlackmagicRawFactory* (*)();
template <typename T>
class ComPtr {
public:
constexpr ComPtr() noexcept = default;
explicit ComPtr(T* raw) noexcept : p_(raw) {}
~ComPtr() { reset(); }
ComPtr(const ComPtr&) = delete;
ComPtr& operator=(const ComPtr&) = delete;
ComPtr(ComPtr&& other) noexcept : p_(std::exchange(other.p_, nullptr)) {}
ComPtr& operator=(ComPtr&& other) noexcept {
if (this != &other) {
reset();
p_ = std::exchange(other.p_, nullptr);
}
return *this;
}
T* get() const noexcept { return p_; }
T* operator->() const noexcept { return p_; }
T& operator*() const noexcept { return *p_; }
explicit operator bool() const noexcept { return p_ != nullptr; }
T* release() noexcept { return std::exchange(p_, nullptr); }
void reset(T* raw = nullptr) noexcept {
T* old = std::exchange(p_, raw);
if (old) old->Release();
}
private:
T* p_ = nullptr;
};
}