Files

116 lines
6.0 KiB
C
Raw Permalink Normal View History

2026-03-28 16:54:11 +11:00
#ifndef ANSRTMP_H
#define ANSRTMP_H
#define ANSRTMP_API __declspec(dllexport)
#include <iostream>
#include "ANSLicense.h"
#include "LabVIEWHeader/extcode.h"
#include <vector>
#include "sys_inc.h"
#include "rtmp_cln.h"
#include "hqueue.h"
#include "http.h"
#include "http_parse.h"
#include "video_decoder.h"
#include "audio_decoder.h"
#include "rtmp_player.h"
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
namespace ANSCENTER
{
class ANSRTMP_API ANSRTMPClient
{
protected:
std::unique_ptr<CRtmpPlayer> _playerClient = std::make_unique<CRtmpPlayer>();
std::string _username;
std::string _password;
std::string _url;
bool _useFullURL;
int _imageRotateDeg = 0;
int _displayWidth = 0; // 0 = no resize (return original resolution)
int _displayHeight = 0;
cv::Mat _pLastFrame;
std::string _lastJpegImage;
int _imageWidth, _imageHeight;
int64_t _pts;
bool _isPlaying;
bool _useNV12FastPath = false;
2026-03-28 16:54:11 +11:00
std::recursive_mutex _mutex;
public:
ANSRTMPClient();
~ANSRTMPClient() noexcept;
[[nodiscard]] bool Init(std::string licenseKey, std::string url);
[[nodiscard]] bool Init(std::string licenseKey, std::string username, std::string password, std::string url);
[[nodiscard]] bool Setup();
[[nodiscard]] bool Reconnect();
[[nodiscard]] bool Start();
[[nodiscard]] bool IsPaused();
[[nodiscard]] bool IsPlaying();
[[nodiscard]] bool IsRecording();
[[nodiscard]] bool Stop();
[[nodiscard]] bool Pause();
void Destroy();
void EnableAudio(bool status);
void SetAudioVolume(int volume);
bool areImagesIdentical(const cv::Mat& img1, const cv::Mat& img2);
[[nodiscard]] cv::Mat GetImage(int& width, int& height, int64_t& pts);
[[nodiscard]] std::string MatToBinaryData(const cv::Mat& image);
[[nodiscard]] std::string GetJpegImage(int& width, int& height, int64_t& pts);
void SetImageRotate(int mode) {
std::lock_guard<std::recursive_mutex> lock(_mutex);
_imageRotateDeg = mode;
if (mode > 360) _imageRotateDeg = 360;
};
void SetBBox(cv::Rect bbox);
void SetCrop(bool crop);
static void SetMaxHWDecoders(int maxDecoders);
static int AutoConfigureHWDecoders(int maxPerGpuOverride = 0);
void SetHWDecoding(int hwMode, int preferredGpu = -1);
bool IsHWDecodingActive();
int GetHWDecodingGpuIndex();
void SetDisplayResolution(int width, int height); // Set display output size; 0,0 = original (no resize)
void SetImageQuality(int mode); // 0=fast (AI), 1=quality (display)
void SetTargetFPS(double intervalMs); // Set min interval between processed frames in ms (0 = no limit, 100 = ~10 FPS, 200 = ~5 FPS)
void SetNV12FastPath(bool enable); // true = NV12 GPU fast path, false = original CPU path (stable)
bool IsNV12FastPath() const { return _useNV12FastPath; }
2026-03-28 16:54:11 +11:00
AVFrame* GetNV12Frame(); // Returns cloned NV12 frame for GPU fast-path (caller must av_frame_free)
AVFrame* GetCudaHWFrame(); // Returns CUDA HW frame (device ptrs) for zero-copy inference
bool IsCudaHWAccel(); // true when decoder uses CUDA (NV12 stays in GPU VRAM)
public:
void CheckLicense();
SPDLogger& _logger = SPDLogger::GetInstance("ANSRTMP", false);
bool _licenseValid{ false };
std::string _licenseKey;
//std::once_flag licenseOnceFlag;
};
}
extern "C" __declspec(dllexport) int CreateANSRTMPHandle(ANSCENTER::ANSRTMPClient * *Handle, const char* licenseKey, const char* username, const char* password, const char* url);
extern "C" __declspec(dllexport) int ReleaseANSRTMPHandle(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int GetRTMPImage(ANSCENTER::ANSRTMPClient * *Handle, int& width, int& height, int64_t & timeStamp, LStrHandle jpegImage);
extern "C" __declspec(dllexport) int GetRTMPtrImage(ANSCENTER::ANSRTMPClient * *Handle, int& width, int& height, int64_t & timeStamp, std::string & jpegImage);
extern "C" __declspec(dllexport) int GetRTMPCVImage(ANSCENTER::ANSRTMPClient** Handle, int& width, int& height, int64_t& timeStamp, cv::Mat** image);
extern "C" __declspec(dllexport) int StartRTMP(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int ReconnectRTMP(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int StopRTMP(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int PauseRTMP(ANSCENTER::ANSRTMPClient** Handle);
extern "C" __declspec(dllexport) int IsRTMPPaused(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int IsRTMPRunning(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) int IsRTMPRecording(ANSCENTER::ANSRTMPClient * *Handle);
extern "C" __declspec(dllexport) void SetRTMPAudioVolume(ANSCENTER::ANSRTMPClient * *Handle, int volume);
extern "C" __declspec(dllexport) void EnableRTMPAudioVolume(ANSCENTER::ANSRTMPClient * *Handle, int status);
extern "C" __declspec(dllexport) void SetRTMPImageRotation(ANSCENTER::ANSRTMPClient * *Handle, double rotationAngle);
extern "C" __declspec(dllexport) int SetBBoxRTMP(ANSCENTER::ANSRTMPClient** Handle, int x, int y, int width, int height);
extern "C" __declspec(dllexport) int SetCropFlagRTMP(ANSCENTER::ANSRTMPClient** Handle, int cropFlag);
extern "C" __declspec(dllexport) void SetRTMPMaxHWDecoders(int maxDecoders);
extern "C" __declspec(dllexport) int AutoConfigureRTMPHWDecoders(int maxPerGpuOverride);
extern "C" __declspec(dllexport) void SetRTMPHWDecoding(ANSCENTER::ANSRTMPClient** Handle, int hwMode, int preferredGpu = -1);
extern "C" __declspec(dllexport) int IsRTMPHWDecodingActive(ANSCENTER::ANSRTMPClient** Handle);
extern "C" __declspec(dllexport) int GetRTMPHWDecodingGpuIndex(ANSCENTER::ANSRTMPClient** Handle);
extern "C" __declspec(dllexport) void SetRTMPImageQuality(ANSCENTER::ANSRTMPClient** Handle, int mode);
extern "C" __declspec(dllexport) void SetRTMPDisplayResolution(ANSCENTER::ANSRTMPClient** Handle, int width, int height);
extern "C" __declspec(dllexport) void SetRTMPTargetFPS(ANSCENTER::ANSRTMPClient** Handle, double intervalMs);
extern "C" __declspec(dllexport) void SetRTMPNV12FastPath(ANSCENTER::ANSRTMPClient** Handle, int enable);
2026-03-28 16:54:11 +11:00
#endif