#pragma once #include // 视频编码器抽象接口 // 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" ... };