Files
EcliptNew/libEcliptPlayer/include/eclipt/Frame.h
2026-03-03 08:13:16 +03:00

91 lines
1.9 KiB
C++

#ifndef ECLIPT_FRAME_H
#define ECLIPT_FRAME_H
#include <cstdint>
#include <cstddef>
#include <memory>
#include <vector>
#include <functional>
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<void(VideoFrame&&)>;
using AudioCallback = std::function<void(AudioFrame&&)>;
}
#endif