#pragma once #include "IVrFFMediaPusher.h" #include #include #include #include #include // MPP 头(仅在 Linux/RK3588 平台真正可用) #if !defined(FFMEDIA_PLATFORM_DUMMY) #include "rk_type.h" #include "rk_mpi.h" #include "mpp_frame.h" #include "mpp_packet.h" #include "mpp_buffer.h" #include "rk_venc_cfg.h" extern "C" { #include #include #include #include #include } #endif class CVrFFMediaPusher : public IVrFFMediaPusher { public: CVrFFMediaPusher(); ~CVrFFMediaPusher() override; int Init(const VrFFPushConfig& config) override; int Start() override; int PushFrame(const void* data, size_t size, int64_t ptsUs = 0) override; int Stop() override; int UnInit() override; std::string GetRtspUrl(const std::string& localIp) const override; private: VrFFPushConfig m_config; std::atomic m_bStarted{false}; std::atomic m_bInited{false}; std::mutex m_mutex; int64_t m_lastPtsUs{0}; #if !defined(FFMEDIA_PLATFORM_DUMMY) // MPP 编码器 MppCtx m_mppCtx{nullptr}; MppApi* m_mppApi{nullptr}; MppBufferGroup m_mppBufGroup{nullptr}; // FFmpeg RTSP 输出 AVFormatContext* m_fmtCtx{nullptr}; std::atomic m_headerWritten{false}; std::mutex m_writeMutex; // 保护 write_frame / write_trailer 跨线程并发 // libswscale 格式转换(非 NV12 输入 → NV12,直接写入 MppBuffer) SwsContext* m_swsCtx{nullptr}; // 编码器参数(16 对齐后的 stride) int m_encWidth{0}; int m_encHeight{0}; int m_encHorStride{0}; int m_encVerStride{0}; bool m_needConvert{false}; // 辅助函数 static uint32_t AlignTo(uint32_t value, uint32_t align); static MppCodingType ToMppCoding(EFFEncodeType t); static int ToAvPixelFormat(EFFPushPixelFormat fmt); int initMppEncoder(); int initRtspOutput(); int initSwscale(); #endif };