91 lines
1.9 KiB
C++
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
|