#pragma once #include "IVrFFMediaPuller.h" #include #include #include #include #include // MPP + FFmpeg 头(仅在 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" extern "C" { #include #include #include #include #include #include } #endif class CVrFFMediaPuller : public IVrFFMediaPuller { public: CVrFFMediaPuller(); ~CVrFFMediaPuller() override; int Init(const VrFFPullConfig& config) override; void SetFrameCallback(FFPulledFrameCallback callback) override; int Start() override; int Stop() override; int UnInit() override; bool IsStreaming() const override; private: VrFFPullConfig m_config; std::atomic m_bStarted{false}; std::atomic m_bInited{false}; FFPulledFrameCallback m_callback; std::mutex m_mutex; #if !defined(FFMEDIA_PLATFORM_DUMMY) // MPP 解码器 MppCtx m_mppCtx{nullptr}; MppApi* m_mppApi{nullptr}; // FFmpeg RTSP 输入 AVFormatContext* m_fmtCtx{nullptr}; AVBSFContext* m_bsfCtx{nullptr}; int m_videoStreamIndex{-1}; // 解码器输出尺寸(从 info_change 获取) int m_decWidth{0}; int m_decHeight{0}; int m_decHorStride{0}; int m_decVerStride{0}; // libswscale 格式转换(NV12 解码输出 → RGBA/BGR) SwsContext* m_swsCtx{nullptr}; bool m_needConvert{false}; int m_outWidth{0}; int m_outHeight{0}; int m_outStride{0}; size_t m_outBufSize{0}; uint8_t* m_outBuffer{nullptr}; // 解码线程 std::thread m_decodeThread; std::atomic m_bRunning{false}; std::atomic m_bStopRunning{false}; // 辅助函数 static MppCodingType AvCodecIdToMppCoding(AVCodecID id); static int ToAvPixelFormat(EFFPullPixelFormat fmt); static unsigned int PixelBpp(EFFPullPixelFormat fmt); int initBitstreamFilter(); int initMppDecoder(); int initSwscale(); void decodeLoop(); #endif };