Feature: Implement H.264 and AV1 hardware encoding for remote control
Remark: Need to update FFmpeg static libraries to take effort
This commit is contained in:
59
client/VideoEncoderBase.h
Normal file
59
client/VideoEncoderBase.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#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" ...
|
||||
};
|
||||
Reference in New Issue
Block a user