GrabBag/Module/FFMediaStream/_Inc/CVrFFMediaPuller.h
2026-06-14 17:01:09 +08:00

88 lines
2.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "IVrFFMediaPuller.h"
#include <atomic>
#include <mutex>
#include <memory>
#include <thread>
#include <cstring>
// 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 <libavcodec/avcodec.h>
#include <libavcodec/bsf.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavutil/log.h>
}
#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<bool> m_bStarted{false};
std::atomic<bool> 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<bool> m_bRunning{false};
std::atomic<bool> 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
};