#ifndef DECODEDATA_H #define DECODEDATA_H #include #include #include #include #include #include "H264_SEI_typedef.h" #include "StitchStruct.h" #include "API_FrontStitch.h" #ifdef __cplusplus extern "C" { #endif #include "libavformat/avformat.h" #include "libswscale/swscale.h" #include "libavutil/opt.h" #include "libavutil/imgutils.h" #include "libavutil/time.h" #include "libavutil/avutil.h" #ifdef __cplusplus } #endif #define UDP_BUFFER_LENGTHIMG 1024 #define UDPIMGWIDTH 1920 #define UDPIMGHEIGHT 1080 typedef struct tagUdpParam { uint32_t nFrameNum; uint32_t nPackNum; uint32_t nPackIndex; uint32_t nDataSize; }UdpParam; typedef struct tagFRAME_LIST_ELEMENT { uint32_t FrameID; uint8_t *pFrameInfo; uint32_t len; } FRAME_LIST_ELEMENT, *PFRAME_LIST_ELEMENT; class DecodeData { public: DecodeData(); //读取文件 // 二进制分包读取文件函数(使用char*作为缓冲区) // 参数: filename - 文件名, chunkSize - 每个包的大小(字节), startPos - 开始读取的位置, buffer - 接收数据的缓冲区 // 返回值: 实际读取的字节数, 0表示读取失败或已到文件末尾 size_t readFileChunk(const std::string& filename, size_t chunkSize, std::streamoff& startPos, char* buffer); void processFileInChunks(const std::string& filename, size_t chunkSize); void DealWithUDPData(char *Buffer, int Length); void processData(char*cH264Data, int iLength); void Init(); void UnInit(); int InitDecode(); int DecodeRGBImageAndPara(unsigned char *RGBBuffer,H264SEI_Para_732 SEIdata); void getPanoSourceData(unsigned char *dst, unsigned char *src); public: int m_CurrentVideo = 1; //0:红外,1:可见光 int m_LocalHeight = 0; int m_FrameNo = 0; int32_t m_nWidth; int32_t m_nHeight; uint8_t *m_cUDPBuffer =NULL; int m_iUDPPoint=0; int m_iUDPState=0; int m_nPos=0; uint32_t m_iImgPacketLen; uint32_t m_iImgPacketLenTest; long m_lIndex = 0; long m_lLostNum = 0; std::mutex m_UDPdataMutex; std::list ImageCapQueue; uint8_t * m_cDecodeBuffer; long m_lDecodePoint=0; int m_nRes = 0; //实时流相关 AVDictionary* m_pFmtOpts; AVDictionary* m_pCodecOpts; AVFormatContext* m_pFmtCtx; AVCodecContext* m_pCodecCtx; AVPacket* m_pPacket; AVFrame* m_pFrame; int m_nVideoStreamIndex; int m_nAudioStreamIndex; int m_nSubtitleStreamIndex; AVCodec* m_pVideoCodec; int m_nVideoTimeBaseNum; int m_nVideoTimeBaseDen; AVPixelFormat m_emPixFmtSrc; AVPixelFormat m_emPixFmtDst; SwsContext* m_pSwsCtx; uint8_t* m_pArrayData[4]; int m_nArrayLinesize[4]; H264SEI_Para_732 SEI_Data = {0}; bool s_bFFMpegInit; //ffmpeg是否初始化 unsigned char* m_pBuffer; //用户格式的数据指针 unsigned char* m_pBufferIR; //用户格式的数据指针 //设备数据处理 bool m_bDataThreadRunning; std::thread* m_ptrThread_DataDealwith; typedef void (DecodeData::*ThreadRunFunPtr)(); static void ThreadEntry(ThreadRunFunPtr pRunFun, void* pOwner); void ThreadFunData(); //数据处理 void DecodeUDPData(uint8_t *cData, long lLength); void DecodeH264Data(uint8_t *h264Data, long dataLength); API_FrontStitch* m_frontStitcher; }; #endif // DECODEDATA_H