60 lines
1.9 KiB
C++
60 lines
1.9 KiB
C++
#pragma once
|
||
#include <cstdint>
|
||
|
||
// 视频编码器抽象接口
|
||
// Step 0: 仅 CX264Encoder 实现;后续 CFFmpegH264Encoder / CFFmpegAV1Encoder 接入
|
||
// 详见 docs/HardwareEncoding_Design.md
|
||
|
||
enum class VideoCodec {
|
||
H264,
|
||
AV1,
|
||
};
|
||
|
||
enum class RateControl {
|
||
CRF, // x264 软编用 CRF (0-51, 越小越好)
|
||
BITRATE, // 硬编路径用目标码率 (kbps)
|
||
};
|
||
|
||
struct EncoderParams {
|
||
int width = 0;
|
||
int height = 0;
|
||
int fps = 30;
|
||
RateControl rc = RateControl::BITRATE;
|
||
int crf = 23; // 当 rc == CRF
|
||
int bitrate_kbps = 4000; // 当 rc == BITRATE
|
||
int gop_seconds = 15; // 关键帧间隔(秒),与 x264 i_keyint_max=fps*15 对齐
|
||
};
|
||
|
||
class VideoEncoderBase {
|
||
public:
|
||
virtual ~VideoEncoderBase() = default;
|
||
|
||
virtual bool open(const EncoderParams& params) = 0;
|
||
virtual void close() = 0;
|
||
|
||
// 编码一帧
|
||
// rgb : 输入像素数据
|
||
// bpp : 24 (RGB) / 32 (BGRA)
|
||
// stride : 源行字节数
|
||
// width/height : 图像尺寸
|
||
// lppData : 输出指针,指向编码后码流(生命周期归编码器,下一次 encode 失效)
|
||
// lpSize : 输出码流字节数;返回 0 表示成功但本帧无输出(硬编首帧延迟)
|
||
// direction : 1 = 上下不翻转,-1 = 翻转(适配 Windows BMP bottom-up)
|
||
// 返回 0 = 成功;< 0 = 失败
|
||
virtual int encode(
|
||
uint8_t* rgb,
|
||
uint8_t bpp,
|
||
uint32_t stride,
|
||
uint32_t width,
|
||
uint32_t height,
|
||
uint8_t** lppData,
|
||
uint32_t* lpSize,
|
||
int direction = 1
|
||
) = 0;
|
||
|
||
virtual void forceIDR() = 0;
|
||
virtual void setBitrate(int kbps) {} // 可选实现,默认 no-op
|
||
virtual VideoCodec codec() const = 0;
|
||
virtual const char* backendName() const = 0; // "x264" / "h264_nvenc" / "av1_amf" ...
|
||
};
|