- class H264NALUParser
- {
- public:
- H264NALUParser(int width , int height);
- H264NALUParser();
- virtual ~H264NALUParser();
- void SetBuffer(unsigned char * buffer,int len,int f,int nri,int type);
- BOOL readOnePacket(unsigned char * buffer,int &len);
- BOOL isPacketOutstanding();
- private:
- unsigned char * m_pNaluBuffer; // NALU数据指向的缓冲区的指针
- unsigned int m_nNaluSize; // NALU数据缓冲区的大小
- unsigned char * m_pCurNaluPos; //指向下一个数据包要读取的缓冲区指针
- int m_nFrameWidth;
- int m_nFrameHeight;
- int m_nPacketCounts;
- int m_nPacketSeqNum;
- int m_nF;
- int m_nNRI;
- int m_nType;
- enum {
- STAP_A = 24,
- STAP_B = 25,
- MTAP16 = 26,
- MTAP24 = 27,
- FU_A = 28,
- FU_B = 29
- };
- };
- ////////////////// class H264NALUParser /////////////////////////////
- H264NALUParser::H264NALUParser(int width , int height)
- {
- m_nFrameWidth = width;
- m_nFrameHeight = height;
- m_pNaluBuffer = NULL;
- m_nNaluSize = 0;
- m_nPacketCounts = 0;
- m_nPacketSeqNum = 0;
- m_nF = 0;
- m_nNRI = 0;
- m_nType = 0;
- }
- H264NALUParser::H264NALUParser()
- {
- m_pNaluBuffer = NULL;
- m_nNaluSize = 0;
- m_nPacketCounts = 0;
- m_nPacketSeqNum = 0;
- m_nF = 0;
- m_nNRI = 0;
- m_nType = 0;
- }
- H264NALUParser::~H264NALUParser()
- {
- }
- void H264NALUParser::SetBuffer(unsigned char * buffer,int len,int f,int nri,int type)
- {
- m_pNaluBuffer = buffer;
- m_nNaluSize = len;
- m_nF = f;
- m_nNRI = nri;
- m_nType = type;
- m_pCurNaluPos = m_pNaluBuffer;
- m_nPacketCounts = (m_nNaluSize + H264_MTU - 1) / H264_MTU;
- m_nPacketSeqNum = 0;
- }
- BOOL H264NALUParser::readOnePacket(unsigned char * buffer,int &len)
- {
- if(m_pCurNaluPos >= m_pNaluBuffer + m_nNaluSize)
- {
- return FALSE;
- }
- struct h264_rtp_hdr header;
- int headersize;
- unsigned char * pCurBuf = buffer;
- if(m_nNaluSize <= H264_MTU)// Single NALU
- {
- header.SingleNALU.f = m_nF;
- header.SingleNALU.nri = m_nNRI;
- header.SingleNALU.type = m_nType;
- headersize = sizeof(header.SingleNALU);
- memcpy(pCurBuf,&(header.SingleNALU),headersize);
- pCurBuf += headersize;
- }
- else// FU-A
- {
- header.FU_A.f = m_nF;
- header.FU_A.nri = m_nNRI;
- header.FU_A.type_indicator = FU_A;
- if(0 == m_nPacketSeqNum)
- {
- header.FU_A.s = 1;
- }
- else
- {
- header.FU_A.s = 0;
- }
- if(m_nPacketSeqNum == m_nPacketCounts - 1)
- {
- header.FU_A.e = 1;
- }
- else
- {
- header.FU_A.e = 0;
- }
- header.FU_A.r = 0;
- header.FU_A.type_header = m_nType;
- //
- headersize = sizeof(header.FU_A);
- memcpy(pCurBuf,&(header.FU_A),headersize);
- pCurBuf += headersize;
- }
- if(m_nPacketSeqNum < m_nPacketCounts - 1)
- {
- memcpy(pCurBuf,m_pCurNaluPos,H264_MTU);
- m_pCurNaluPos += H264_MTU;
- len = headersize + H264_MTU;
- }
- else
- {
- int remainLen = m_nNaluSize % H264_MTU;
- if(0 == remainLen)
- {
- remainLen = H264_MTU;
- }
- memcpy(pCurBuf,m_pCurNaluPos,remainLen);
- m_pCurNaluPos += remainLen;
- len = headersize + remainLen;
- }
- m_nPacketSeqNum ++;
- return TRUE;
- }
- BOOL H264NALUParser::isPacketOutstanding()
- {
- return (m_nPacketSeqNum < m_nPacketCounts);
- }
H264NALUParser
最新推荐文章于 2025-07-14 17:36:31 发布