63 lines
2.0 KiB
C++
63 lines
2.0 KiB
C++
#pragma once
|
||
|
||
#include "VideoEncoderBase.h"
|
||
#include "common/config.h"
|
||
#include <string>
|
||
#include <vector>
|
||
|
||
// 合规守护:DISABLE_FFMPEG_FOR_TEST=1 时整类移出编译单元,避免 GPL 传染(与 c0a632a 对齐)
|
||
#if defined(_WIN64) && !DISABLE_FFMPEG_FOR_TEST
|
||
|
||
struct AVCodecContext;
|
||
struct AVFrame;
|
||
struct AVPacket;
|
||
|
||
// FFmpeg 硬编 H.264 实现。
|
||
// Step 1: 仅探测 h264_nvenc 单后端,足以验证 FFmpeg 静态库集成链路。
|
||
// Step 2: 扩展 h264_qsv / h264_amf / h264_mf。
|
||
//
|
||
// 输入像素:BGRA (bpp=32) / RGB24 (bpp=24),与 CX264Encoder 完全一致;
|
||
// 内部转 NV12 喂给 FFmpeg encoder。
|
||
class CFFmpegH264Encoder : public VideoEncoderBase
|
||
{
|
||
public:
|
||
CFFmpegH264Encoder();
|
||
~CFFmpegH264Encoder() override;
|
||
|
||
bool open(const EncoderParams& params) override;
|
||
void close() override;
|
||
|
||
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
|
||
) override;
|
||
|
||
void forceIDR() override { m_forceIDR = true; }
|
||
void setBitrate(int kbps) override;
|
||
VideoCodec codec() const override { return VideoCodec::H264; }
|
||
const char* backendName() const override { return m_backend.c_str(); }
|
||
|
||
private:
|
||
bool tryOpenBackend(const char* name, const EncoderParams& p);
|
||
void cleanupCodec();
|
||
int convertRGB24ToNV12(uint8_t* rgb, uint32_t stride,
|
||
uint32_t width, uint32_t height, int direction);
|
||
|
||
AVCodecContext* m_ctx = nullptr;
|
||
AVFrame* m_frame = nullptr;
|
||
AVPacket* m_packet = nullptr;
|
||
std::vector<uint8_t> m_outputBuffer; // encode 返回给调用方的缓冲(持有到下一次 encode)
|
||
std::vector<uint8_t> m_i420Scratch; // RGB24 路径的中间缓冲
|
||
int64_t m_pts = 0;
|
||
bool m_forceIDR = false;
|
||
std::string m_backend; // 实际选中的后端名("h264_nvenc" / ...)
|
||
};
|
||
|
||
#endif // _WIN64 && !DISABLE_FFMPEG_FOR_TEST
|