2026-05-31 00:15:25 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include "IVrFFMediaPuller.h"
|
|
|
|
|
|
#include <atomic>
|
|
|
|
|
|
#include <mutex>
|
|
|
|
|
|
#include <memory>
|
2026-06-08 17:36:13 +08:00
|
|
|
|
#include <thread>
|
|
|
|
|
|
#include <cstring>
|
2026-05-31 00:15:25 +08:00
|
|
|
|
|
2026-06-08 17:36:13 +08:00
|
|
|
|
// MPP + FFmpeg 头(仅在 Linux/RK3588 平台真正可用)
|
2026-05-31 00:15:25 +08:00
|
|
|
|
#if !defined(FFMEDIA_PLATFORM_DUMMY)
|
2026-06-08 17:36:13 +08:00
|
|
|
|
#include "rk_type.h"
|
|
|
|
|
|
#include "rk_mpi.h"
|
|
|
|
|
|
#include "mpp_frame.h"
|
|
|
|
|
|
#include "mpp_packet.h"
|
|
|
|
|
|
#include "mpp_buffer.h"
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" {
|
2026-06-14 17:01:09 +08:00
|
|
|
|
#include <libavcodec/avcodec.h>
|
|
|
|
|
|
#include <libavcodec/bsf.h>
|
2026-06-08 17:36:13 +08:00
|
|
|
|
#include <libavformat/avformat.h>
|
|
|
|
|
|
#include <libswscale/swscale.h>
|
|
|
|
|
|
#include <libavutil/imgutils.h>
|
|
|
|
|
|
#include <libavutil/log.h>
|
|
|
|
|
|
}
|
2026-05-31 00:15:25 +08:00
|
|
|
|
#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)
|
2026-06-08 17:36:13 +08:00
|
|
|
|
// MPP 解码器
|
|
|
|
|
|
MppCtx m_mppCtx{nullptr};
|
|
|
|
|
|
MppApi* m_mppApi{nullptr};
|
|
|
|
|
|
|
|
|
|
|
|
// FFmpeg RTSP 输入
|
|
|
|
|
|
AVFormatContext* m_fmtCtx{nullptr};
|
2026-06-14 17:01:09 +08:00
|
|
|
|
AVBSFContext* m_bsfCtx{nullptr};
|
2026-06-08 17:36:13 +08:00
|
|
|
|
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);
|
2026-06-14 17:01:09 +08:00
|
|
|
|
int initBitstreamFilter();
|
2026-06-08 17:36:13 +08:00
|
|
|
|
int initMppDecoder();
|
|
|
|
|
|
int initSwscale();
|
|
|
|
|
|
void decodeLoop();
|
2026-05-31 00:15:25 +08:00
|
|
|
|
#endif
|
|
|
|
|
|
};
|