Files

179 lines
6.2 KiB
C
Executable File

/*
* Copyright (c) XCAM. All rights reserved.
*/
#ifndef _LIVESTREAM_RTP_SESSION_H_
#define _LIVESTREAM_RTP_SESSION_H_
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
/*RTP Payload type define rfc3551*/
typedef enum {
RTP_PT_PCMU = 0, /* mu-law G.711Mu*/
RTP_PT_GSM = 3, /* GSM */
RTP_PT_G723 = 4, /* G.723 */
RTP_PT_PCMA = 8, /* a-law G.711A*/
RTP_PT_G722 = 9, /* G.722 */
RTP_PT_L16_STEREO = 10, /* linear 16, 44.1khz, 2 channel */
RTP_PT_L16_MONO = 11, /* linear 16, 44.1khz, 1 channel */
RTP_PT_MPA = 14, /* mpeg audio */
RTP_PT_JPEG = 26, /* jpeg */
RTP_PT_H261 = 31, /* h.261 */
RTP_PT_MPV = 32, /* mpeg video */
RTP_PT_MP2T = 33, /* mpeg2 TS stream */
RTP_PT_H263 = 34, /* old H263 encapsulation */
/*96-127 dynamic*/
RTP_PT_H264 = 96, /* xmedia define as h.264 */
RTP_PT_G726 = 97, /* xmedia define as G.726 */
RTP_PT_H265 = 98, /* xmedia define as h.265 */
RTP_PT_DATA = 100, /* xmedia define as md alarm data*/
RTP_PT_AMR = 101, /* xmedia define as AMR*/
RTP_PT_MJPEG = 102, /* xmedia define as MJPEG */
RTP_PT_YUV = 103, /* xmedia define as YUV*/
RTP_PT_ADPCM = 104, /* xmedia define as ADPCM */
RTP_PT_AAC = 105, /* xmedia define as AAC */
RTP_PT_SEC = 106, /* xmedia define as SEC*/
RTP_PT_RED = 107, /* xmedia define as RED */
RTP_PT_INVALID = 128
} rtp_payload_type;
typedef enum {
PACK_TYPE_RAW = 0,
PACK_TYPE_RTP,
PACK_TYPE_RTP_STAP,
PACK_TYPE_RTP_FUA,
PACK_TYPE_RTSP_ITLV,
PACK_TYPE_XM_ITLV,
PACK_TYPE_RTSP_O_HTTP,
PACK_TYPE_BUTT
} rtp_pack_type;
typedef enum {
RTP_TRANS_UDP = 0,
RTP_TRANS_UDP_ITLV,
RTP_TRANS_TCP,
RTP_TRANS_TCP_ITLV,
RTP_TRANS_BROADCAST,
RTP_TRANS_BUTT
} rtp_trans_mode;
#ifndef BYTE_ORDER
#define BYTE_ORDER LITTLE_ENDIAN
#endif
/* total 12Bytes */
typedef struct {
#if (BYTE_ORDER == LITTLE_ENDIAN)
/* byte 0 */
xcam_u16 cc : 4; /* CSRC count */
xcam_u16 x : 1; /* header extension flag */
xcam_u16 p : 1; /* padding flag */
xcam_u16 version : 2; /* protocol version */
/* byte 1 */
xcam_u16 pt : 7; /* payload type */
xcam_u16 marker : 1; /* marker bit */
#elif (BYTE_ORDER == BIG_ENDIAN)
/* byte 0 */
xcam_u16 version : 2; /* protocol version */
xcam_u16 p : 1; /* padding flag */
xcam_u16 x : 1; /* header extension flag */
xcam_u16 cc : 4; /* CSRC count */
/*byte 1*/
xcam_u16 marker : 1; /* marker bit */
xcam_u16 pt : 7; /* payload type */
#else
#error YOU MUST DEFINE BYTE_ORDER == LITTLE_ENDIAN OR BIG_ENDIAN !
#endif
/* bytes 2, 3 */
xcam_u16 seqno : 16; /* sequence number */
/* bytes 4-7 */
xcam_u32 ts; /* timestamp in ms */
/* bytes 8-11 */
xcam_u32 ssrc; /* synchronization source */
} rtp_pack_hdr;
/*rtp field packet*/
#define RTP_HDR_SET_VERSION(HDR, val) ((HDR)->version = val)
#define RTP_HDR_SET_P(HDR, val) ((HDR)->p = val)
#define RTP_HDR_SET_X(HDR, val) ((HDR)->x = val)
#define RTP_HDR_SET_CC(HDR, val) ((HDR)->cc = val)
#define RTP_HDR_SET_M(HDR, val) ((HDR)->marker = val)
#define RTP_HDR_SET_PT(HDR, val) ((HDR)->pt = val)
#define RTP_HDR_SET_SEQNO(HDR, _sn) ((HDR)->seqno = (_sn))
#define RTP_HDR_SET_TS(HDR, _ts) ((HDR)->ts = (_ts))
#define RTP_HDR_SET_SSRC(HDR, _ssrc) ((HDR)->ssrc = _ssrc)
#define RTP_TRANS_IP_MAX_LEN (32)
/*rtsp interleaved packet*/
typedef struct {
xcam_u8 daollar; /*8, $:dollar sign(24 decimal)*/
xcam_u8 chn_id; /*8, channel id*/
xcam_u16 payload_len; /*16, payload length*/
rtp_pack_hdr rtp_head; /*rtp head*/
} rtsp_itleaved_hdr;
typedef enum {
RTP_SESSION_STATE_INIT = 0,
RTP_SESSION_STATE_READY = 1,
RTP_SESSION_STATE_PLAY = 2,
RTP_SESSION_STATE_STOP = 3,
RTP_SESSION_STATE_BUTT
} xcam_rtp_session_state;
typedef struct {
rtp_pack_type pack_type;
rtp_trans_mode media_trans_mode;
xcam_s32 rtp_send_sock;
xcam_s32 client_rtp_port;
xcam_s32 server_rtp_port;
xcam_u32 seq_num;
xcam_u32 ssrc;
xcam_u32 data_len;
xcam_char* pack_buffer;
xcam_u32 itlv_client_media_chnid;
xcam_u32 itlv_client_adapt_chnid;
xcam_rtp_session_state session_state;
xcam_char client_ip[RTP_TRANS_IP_MAX_LEN];
struct sockaddr_in client_sockaddr;
} livestream_rtp_session;
xcam_s32 livestream_rtp_session_update_seq_num(livestream_rtp_session* rtp_session, xcam_u32 seq_num);
xcam_s32 livestream_rtp_session_get_packet_and_send_param(livestream_rtp_session* rtp_session, xcam_s32* ptr_write_sock,
struct sockaddr_in* ptr_peer_sockaddr, xcam_u32* ptr_last_sn,
rtp_pack_type* ptr_pack_type, xcam_u32* ptr_ssrc);
xcam_s32 livestream_rtp_session_send_data_in_rtsp_itlv(livestream_rtp_session* rtp_session, const xcam_u8* data_addr,
xcam_u32 data_len, xcam_u32 ts, rtp_payload_type rtp_type, xcam_u32* seq_num, xcam_u32 ssrc,
xcam_s32 write_sock, struct sockaddr_in* peer_sockaddr, xcam_s32 packet_len);
xcam_s32 livestream_rtp_session_send_data_in_rtp(livestream_rtp_session* session, const xcam_u8* data_addr,
xcam_u32 data_len, xcam_u32 ts, rtp_payload_type package_type, xcam_u32* seq_num,
xcam_u32 ssrc, xcam_s32 write_sock, const struct sockaddr_in* peer_sockaddr, xcam_s32 packet_len);
xcam_s32 livestream_rtp_session_start(livestream_rtp_session* rtp_session);
xcam_s32 livestream_rtp_session_stop(livestream_rtp_session* rtp_session);
xcam_s32 livestream_rtp_session_create(livestream_rtp_session** rtp_session, xcam_s32 packet_len);
xcam_s32 livestream_rtp_session_destroy(livestream_rtp_session* rtp_session);
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */
#endif /*_LIVESTREAM_RTP_SESSION_H_*/