//#pragma once
#pragma comment(lib, "ws2_32.lib")
#include <stdint.h>

#define RTP_VESION              2

#define RTP_PAYLOAD_TYPE_H264   96
#define RTP_PAYLOAD_TYPE_AAC    97

#define RTP_HEADER_SIZE         12
#define RTP_MAX_PKT_SIZE        1400

/*
 *    0                   1                   2                   3
 *    7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0|7 6 5 4 3 2 1 0
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |V=2|P|X|  CC   |M|     PT      |       sequence number         |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                           timestamp                           |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |           synchronization source (SSRC) identifier            |
 *   +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
 *   |            contributing source (CSRC) identifiers             |
 *   :                             ....                              :
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *
 */
struct RtpHeader
{
    /* byte 0 */
    uint8_t csrcLen : 4;//CSRCռ4λָʾCSRC ʶĸ
    uint8_t extension : 1;//ռ1λX=1RTPͷһչͷ
    uint8_t padding : 1;//־ռ1λP=1ڸñĵβһİλ飬ǲЧغɵһ֡
    uint8_t version : 2;//RTPЭİ汾ţռ2λǰЭ汾Ϊ2

    /* byte 1 */
    uint8_t payloadType : 7;//Чغͣռ7λ˵RTPЧغɵͣGSMƵJPEMͼȡ
    uint8_t marker : 1;//ǣռ1λͬЧغвͬĺ壬Ƶһ֡ĽƵǻỰĿʼ

    /* bytes 2,3 */
    uint16_t seq;//ռ16λڱʶ͵RTPĵкţÿһģк1ͨкⱨĶʧģָݡ

    /* bytes 4-7 */
    uint32_t timestamp;//ռ32λʱӳ˸RTPĵĵһλĲʱ̡ʹʱӳٺӳٶͬơ

    /* bytes 8-11 */
    uint32_t ssrc;//ռ32λڱʶͬԴñʶѡģμͬһƵͬԴͬSSRC

    /*׼RTP Header ܴ 0-15ԼԴ(CSRC)ʶ

    ÿCSRCʶռ32λ015ÿCSRCʶ˰ڸRTPЧغеԼԴ

    */
};

struct RtpPacket
{
    struct RtpHeader rtpHeader;
    uint8_t payload[0];
};

void RtpHeaderInit(struct RtpPacket* rtpPacket, uint8_t csrcLen, uint8_t extension,
    uint8_t padding, uint8_t version, uint8_t payloadType, uint8_t marker,
    uint16_t seq, uint32_t timestamp, uint32_t ssrc);

int RtpSendPacketOverTcp(int clientSockfd, struct RtpPacket* rtpPacket, uint32_t dataSize);
int RtpSendPacketOverUdp(int serverRtpSockfd, const char* ip, int16_t port, struct RtpPacket* rtpPacket, uint32_t dataSize);


