OBS-rtmp源码剖析之rtmp常用结构体介绍(一)

最近在看obs-studio的源码,这里将源码学习的东西记录下来,方便查看和系统结构化。
rtmp.c文件位于obs-studio工程中obs-outputs中:
1、rtmp.h中常用结构体如下

    typedef struct RTMPChunk
    {
        int c_headerSize;
        int c_chunkSize;
        char *c_chunk;
        char c_header[RTMP_MAX_HEADER_SIZE];
    } RTMPChunk;

    typedef struct RTMPPacket
    {
        uint8_t m_headerType;
        uint8_t m_packetType;
        uint8_t m_hasAbsTimestamp;  /* timestamp absolute or relative? */
        int m_nChannel;
        uint32_t m_nTimeStamp;  /* timestamp */
        int32_t m_nInfoField2;  /* last 4 bytes in a long header */
        uint32_t m_nBodySize;
        uint32_t m_nBytesRead;
        RTMPChunk *m_chunk;
        char *m_body;
    } RTMPPacket;

    typedef struct RTMPSockBuf
    {
        SOCKET sb_socket;
        int sb_size;        /* number of unprocessed bytes in buffer */
        char *sb_start;     /* pointer into sb_pBuffer of next byte to process */
        char sb_buf[RTMP_BUFFER_CACHE_SIZE];    /* data read from socket */
        int sb_timedout;
        void *sb_ssl;
    } RTMPSockBuf;

    typedef struct RTMP_Stream {
        int id;
        AVal playpath;
    } RTMP_Stream;

    typedef struct RTMP_LNK
    {
#define RTMP_MAX_STREAMS 8
        RTMP_Stream streams[RTMP_MAX_STREAMS];
        int nStreams;
        int curStreamIdx;
        int playingStreams;

        AVal hostname;
        AVal sockshost;

        AVal tcUrl;
        AVal swfUrl;
        AVal pageUrl;
        AVal app;
        AVal auth;
        AVal flashVer;
        AVal subscribepath;
        AVal usherToken;
        AVal token;
        AVal pubUser;
        AVal pubPasswd;
        AMFObject extras;
        int edepth;

        int seekTime;
        int stopTime;

#define RTMP_LF_AUTH    0x0001  /* using auth param */
#define RTMP_LF_LIVE    0x0002  /* stream is live */
#define RTMP_LF_SWFV    0x0004  /* do SWF verification */
#define RTMP_LF_PLST    0x0008  /* send playlist before play */
#define RTMP_LF_BUFX    0x0010  /* toggle stream on BufferEmpty msg */
#define RTMP_LF_FTCU    0x0020  /* free tcUrl on close */
        int lFlags;

        int swfAge;

        int protocol;
        int timeout;        /* connection timeout in seconds */

#define RTMP_PUB_NAME   0x0001  /* send login to server */
#define RTMP_PUB_RESP   0x0002  /* send salted password hash */
#define RTMP_PUB_ALLOC  0x0004  /* allocated data for new tcUrl & app */
#define RTMP_PUB_CLEAN  0x0008  /* need to free allocated data for newer tcUrl & app at exit */
#define RTMP_PUB_CLATE  0x0010  /* late clean tcUrl & app at exit */
        int pFlags;

        unsigned short socksport;
        unsigned short port;

#ifdef CRYPTO
#define RTMP_SWF_HASHLEN    32
        void *dh;           /* for encryption */
        void *rc4keyIn;
        void *rc4keyOut;

        uint32_t SWFSize;
        uint8_t SWFHash[RTMP_SWF_HASHLEN];
        char SWFVerificationResponse[RTMP_SWF_HASHLEN+10];
#endif
    } RTMP_LNK;

    /* state for read() wrapper */
    typedef struct RTMP_READ
    {
        char *buf;
        char *bufpos;
        unsigned int buflen;
        uint32_t timestamp;
        uint8_t dataType;
        uint8_t flags;
#define RTMP_READ_HEADER    0x01
#define RTMP_READ_RESUME    0x02
#define RTMP_READ_NO_IGNORE 0x04
#define RTMP_READ_GOTKF     0x08
#define RTMP_READ_GOTFLVK   0x10
#define RTMP_READ_SEEKING   0x20
        int8_t status;
#define RTMP_READ_COMPLETE  -3
#define RTMP_READ_ERROR -2
#define RTMP_READ_EOF   -1
#define RTMP_READ_IGNORE    0

        /* if bResume == TRUE */
        uint8_t initialFrameType;
        uint32_t nResumeTS;
        char *metaHeader;
        char *initialFrame;
        uint32_t nMetaHeaderSize;
        uint32_t nInitialFrameSize;
        uint32_t nIgnoredFrameCounter;
        uint32_t nIgnoredFlvFrameCounter;
    } RTMP_READ;

    typedef struct RTMP_METHOD
    {
        AVal name;
        int num;
    } RTMP_METHOD;

    typedef struct RTMP_BINDINFO
    {
        struct sockaddr_storage addr;
        int addrLen;
     } RTMP_BINDINFO;
    typedef struct RTMP
    {
        int m_inChunkSize;
        int m_outChunkSize;
        int m_nBWCheckCounter;
        int m_nBytesIn;
        int m_nBytesInSent;
        int m_nBufferMS;
        int m_stream_id;        /* returned in _result from createStream */
        int m_mediaChannel;
        uint32_t m_mediaStamp;
        uint32_t m_pauseStamp;
        int m_pausing;
        int m_nServerBW;
        int m_nClientBW;
        uint8_t m_nClientBW2;
        uint8_t m_bPlaying;
        uint8_t m_bSendEncoding;
        uint8_t m_bSendCounter;

        uint8_t m_bUseNagle;
        uint8_t m_bCustomSend;
        void*   m_customSendParam;
        CUSTOMSEND m_customSendFunc;

        RTMP_BINDINFO m_bindIP;

        uint8_t m_bSendChunkSizeInfo;

        int m_numInvokes;
        int m_numCalls;
        RTMP_METHOD *m_methodCalls; /* remote method calls queue */

        int m_channelsAllocatedIn;
        int m_channelsAllocatedOut;
        RTMPPacket **m_vecChannelsIn;
        RTMPPacket **m_vecChannelsOut;
        int *m_channelTimestamp;    /* abs timestamp of last packet */

        double m_fAudioCodecs;  /* audioCodecs for the connect packet */
        double m_fVideoCodecs;  /* videoCodecs for the connect packet */
        double m_fEncoding;     /* AMF0 or AMF3 */

        double m_fDuration;     /* duration of stream in seconds */

        int m_msgCounter;       /* RTMPT stuff */
        int m_polling;
        int m_resplen;
        int m_unackd;
        AVal m_clientID;

        RTMP_READ m_read;
        RTMPPacket m_write;
        RTMPSockBuf m_sb;
        RTMP_LNK Link;
        int connect_time_ms;
        int last_error_code;
    } RTMP;

2、rtmp结构体的内存分配和释放

RTMP *
RTMP_Alloc()
{
    return calloc(1, sizeof(RTMP));
}

void
RTMP_Free(RTMP *r)
{
    free(r);
}

3、rtmp结构体的初始化

void
RTMP_Init(RTMP *r)
{
#ifdef CRYPTO
    if (!RTMP_TLS_ctx)
        RTMP_TLS_Init();
#endif

    memset(r, 0, sizeof(RTMP));
    r->m_sb.sb_socket = -1;
    r->m_inChunkSize = RTMP_DEFAULT_CHUNKSIZE;
    r->m_outChunkSize = RTMP_DEFAULT_CHUNKSIZE;
    r->m_bSendChunkSizeInfo = 1;
    r->m_nBufferMS = 30000;
    r->m_nClientBW = 2500000;
    r->m_nClientBW2 = 2;
    r->m_nServerBW = 2500000;
    r->m_fAudioCodecs = 3191.0;
    r->m_fVideoCodecs = 252.0;
    r->Link.curStreamIdx = 0;
    r->Link.nStreams = 0;
    r->Link.timeout = 30;
    r->Link.swfAge = 30;
}

4.rtmp的结构体赋值

void
RTMP_EnableWrite(RTMP *r)
{
    r->Link.protocol |= RTMP_FEATURE_WRITE;
}

double
RTMP_GetDuration(RTMP *r)
{
    return r->m_fDuration;
}

int
RTMP_IsConnected(RTMP *r)
{
    return r->m_sb.sb_socket != INVALID_SOCKET;
}

SOCKET
RTMP_Socket(RTMP *r)
{
    return r->m_sb.sb_socket;
}

int
RTMP_IsTimedout(RTMP *r)
{
    return r->m_sb.sb_timedout;
}

void
RTMP_SetBufferMS(RTMP *r, int size)
{
    r->m_nBufferMS = size;
}

void
RTMP_UpdateBufferMS(RTMP *r)
{
    RTMP_SendCtrl(r, 3, r->m_stream_id, r->m_nBufferMS);
}

猜你喜欢

转载自blog.csdn.net/tong5956/article/details/81477108