RTP_h264解包源码

更新时间:2023-07-19 04:36:04 阅读: 评论:0

//// class CH264_RTP_UNPACK 
class CH264_RTP_UNPACK 
 
#define RTP_VERSION 2 
#define BUF_SIZE (1024 * 500) 
 
    typedef struct 
    { 
        //LITTLE_ENDIAN 
        unsigned short   cc:4;/* CSRC count                 */ 
        unsigned short   x:1; /* header extension flag      */ 
        unsigned short   p:1; /* padding flag               */ 
        unsigned short   v:2; /* packet type                */ 
        unsigned short   pt:7;/* payload type               */ 
        unsigned short   m:1; /* marker bit                 */ 
 
        unsigned short    q;/* quence number            */ 
        unsigned long     ts; /* timestamp                  */ 
        unsigned long     ssrc;/*synchronization source     */ 
    } rtp_hdr_t; 
public: 
 
    CH264_RTP_UNPACK ( HRESULT &hr, unsigned char H264PAYLOADTYPE = 96 ) 
        : m_bSPSFound(fal) 
        , m_bWaitKeyFrame(true) 
        , m_bPrevFrameEnd(fal) 
        , m_bAsmblingFrame(fal) 
        , m_wSeq(1234) 
        , m_ssrc(0) 
    { 
        m_pBuf = new BYTE[BUF_SIZE] ; 
        if ( m_pBuf == NULL ) 
        { 
            hr = E_OUTOFMEMORY ; 
            return ; 
        } 
 
        m_H264PAYLOADTYPE = H264PAYLOADTYPE ; 
        m_pEnd = m_pBuf + BUF_SIZE ; 
        m_pStart = m_pBuf ; 
        m_dwSize = 0 ; 
        hr = S_OK ; 
    } 
窄带物联网 
    ~CH264_RTP_UNPACK(void) 
    { 
什么手机最便宜        delete [] m_pBuf ; 
    } 
 
写景的段落
//pBufH264 RTP视频数据包,nSizeRTP视频数据包字节长度,outSize为输出视频数据帧字节长度。 绞监候
//返回值为指向视频数据帧的指针。输入数据可能被破坏。 
    BYTE* Par_RTP_Packet ( BYTE *pBuf, unsigned short nSize, int *outSize ) 
    { 
        if ( nSize <= 12 ) 
的故事作文
        { 
            return NULL ; 
        } 
        BYTE *cp = (BYTE*)&m_RTP_Header ; 
        cp[0] = pBuf[0] ; 
        cp[1] = pBuf[1] ; 
        m_RTP_Header.q = pBuf[2] ; 
        m_RTP_Header.q <<= 8 ; 
        m_RTP_Header.q |= pBuf[3] ; 
        m_RTP_Header.ts = pBuf[4] ; 
        m_RTP_Header.ts <<= 8 ; 
        m_RTP_Header.ts |= pBuf[5] ; 
        m_RTP_Header.ts <<= 8 ; 
        m_RTP_Header.ts |= pBuf[6] ; 
        m_RTP_Header.ts <<= 8 ; 
        m_RTP_Header.ts |= pBuf[7] ; 
小太监净身
        m_RTP_Header.ssrc = pBuf[8] ; 
        m_RTP_Header.ssrc <<= 8 ; 
        m_RTP_Header.ssrc |= pBuf[9] ; 
        m_RTP_Header.ssrc <<= 8 ; 
        m_RTP_Header.ssrc |= pBuf[10] ; 
        m_RTP_Header.ssrc <<= 8 ; 
        m_RTP_Header.ssrc |= pBuf[11] ; 
 
        BYTE *pPayload = pBuf + 12 ; 
        DWORD PayloadSize = nSize - 12 ; 
 
        // Check the RTP version number (it should be 2): 
        if ( m_RTP_Header.v != RTP_VERSION ) 
        { 
            return NULL ; 
        } 
 
        /* 
        // Skip over any CSRC identifiers in the header: 
神秘莫测的意思        if ( m_RTP_Header ) 
        { 
            long cc = m_RTP_Header * 4 ; 
捧腹大笑            if ( Size < cc ) 
            { 
                return NULL ; 
            } 
 
            Size -= cc ; 
            p += cc ; 
        }
 
        // Check for (& ignore) any RTP header extension 
        if ( m_RTP_Header.x ) 
        { 
            if ( Size < 4 ) 
            { 
                return NULL ; 
            } 
 
            Size -= 4 ; 
            p += 2 ; 
            long l = p[0] ; 
            l <<= 8 ; 
            l |= p[1] ; 
            p += 2 ; 
            l *= 4 ; 
            if ( Size < l ) ; 
            { 
                return NULL ; 
            } 
            Size -= l ; 
            p += l ; 
        } 
       
        // Discard any padding bytes: 
        if ( m_RTP_Header.p ) 
        { 
            if ( Size == 0 ) 
            { 
                return NULL ; 
            } 
            long Padding = p[Size-1] ; 
            if ( Size < Padding ) 
            { 
                return NULL ; 
            } 
            Size -= Padding ; 
        }*/ 
 
        // Check the Payload Type. 
        if ( m_RTP_Header.pt != m_H264PAYLOADTYPE ) 
        { 
            return NULL ; 
        } 
 
        int PayloadType = pPayload[0] & 0x1f ; 
        int NALType = PayloadType ; 
        if ( NALType == 28 ) // FU_A 
        { 
            if ( PayloadSize < 2 ) 
            { 
                return NULL ; 
            } 
 
            NALType = pPayload[1] & 0x1f ; 

本文发布于:2023-07-19 04:36:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1087283.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   视频   字节
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图