#ifndef ECLIPT_FRAME_H #define ECLIPT_FRAME_H #include #include #include #include #include namespace eclipt { enum class PixelFormat { YUV420, RGB24, NV12, BGRA32 }; enum class FrameType { Video, Audio, Subtitle }; struct FrameBuffer { uint8_t* data = nullptr; size_t size = 0; size_t stride = 0; FrameBuffer() = default; FrameBuffer(uint8_t* d, size_t s, size_t st = 0) : data(d), size(s), stride(st) {} }; struct VideoFrame { uint32_t width = 0; uint32_t height = 0; PixelFormat format = PixelFormat::YUV420; int64_t pts = 0; int64_t dts = 0; int64_t duration = 0; FrameBuffer planes[3]; bool is_interpolated = false; float interpolation_factor = 0.0f; VideoFrame() = default; bool isValid() const { return width > 0 && height > 0 && planes[0].data != nullptr; } size_t totalSize() const { switch (format) { case PixelFormat::YUV420: return width * height * 3 / 2; case PixelFormat::RGB24: return width * height * 3; case PixelFormat::NV12: return width * height * 3 / 2; case PixelFormat::BGRA32: return width * height * 4; default: return 0; } } }; struct AudioFrame { int sample_rate = 0; int channels = 0; int format = 0; int64_t pts = 0; int64_t duration = 0; FrameBuffer buffer; size_t totalSize() const { return buffer.size; } }; class IFramePool { public: virtual ~IFramePool() = default; virtual VideoFrame acquire() = 0; virtual void release(VideoFrame&& frame) = 0; virtual void clear() = 0; virtual size_t available() const = 0; }; using FrameCallback = std::function; using AudioCallback = std::function; } #endif