GrabBag/Module/FFMediaStream/Inc/IVrFFMediaPuller.h

96 lines
2.5 KiB
C
Raw Normal View History

#pragma once
#include <cstdint>
#include <cstddef>
#include <string>
#include <functional>
// DLL 导出宏FFMEDIASTREAM_LIBRARY 在 .pro 中已定义)
#ifdef _WIN32
# ifdef FFMEDIASTREAM_LIBRARY
# define VR_FFMEDIA_API __declspec(dllexport)
# else
# define VR_FFMEDIA_API __declspec(dllimport)
# endif
#else
# define VR_FFMEDIA_API
#endif
/**
* @brief
*/
enum class EFFPullPixelFormat
{
NV12 = 0, // 原生硬解输出,零拷贝最快
RGBA32, // 适合 QImage::Format_RGBA8888 直接显示
BGR24, // 适合 OpenCV
};
/**
* @brief
*/
struct VrFFPullConfig
{
std::string rtspUrl; // rtsp://user:pass@host:port/path
bool useTcp{true}; // true=TCP 模式false=UDP低延迟但容易丢包
bool enableVideo{true};
bool enableAudio{false};
// 解码后输出:是否做 RGA 转换到 RGBA32 / BGR24以及目标分辨率
EFFPullPixelFormat outputFormat{EFFPullPixelFormat::RGBA32};
unsigned int outputWidth{0}; // 0 = 跟随输入
unsigned int outputHeight{0};
};
/**
* @brief
*/
struct VrFFPulledFrame
{
const void* data{nullptr};
size_t size{0};
unsigned int width{0};
unsigned int height{0};
unsigned int stride{0}; // 一行字节数RGBA=width*4BGR=width*3NV12=hstride
EFFPullPixelFormat format{EFFPullPixelFormat::RGBA32};
int64_t ptsUs{0}; // PTS
};
using FFPulledFrameCallback = std::function<void(const VrFFPulledFrame&)>;
/**
* @brief IVrFFMediaPuller
*
* ffmedia_release RTSP RTSP -> MPP -> RGA ->
*
*
* IVrFFMediaPuller* puller = nullptr;
* IVrFFMediaPuller::CreateObject(&puller);
* puller->Init(cfg);
* puller->SetFrameCallback([](const VrFFPulledFrame& f){ ... });
* puller->Start();
* ...
* puller->Stop();
* delete puller;
*/
class VR_FFMEDIA_API IVrFFMediaPuller
{
public:
virtual ~IVrFFMediaPuller() = default;
static bool CreateObject(IVrFFMediaPuller** ppPuller);
virtual int Init(const VrFFPullConfig& config) = 0;
virtual void SetFrameCallback(FFPulledFrameCallback callback) = 0;
virtual int Start() = 0;
virtual int Stop() = 0;
virtual int UnInit() = 0;
/**
* @brief
*/
virtual bool IsStreaming() const = 0;
};