⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtp.h

📁 完整的RTP RTSP代码库
💻 H
字号:
/* * FILE:   rtp.h * AUTHOR: Colin Perkins <c.perkins@cs.ucl.ac.uk> * * $Revision: 1.23 $  * $Date: 2007/09/18 20:52:01 $ *  * Copyright (c) 1998-2000 University College London * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, is permitted provided that the following conditions  * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *      This product includes software developed by the Computer Science *      Department at University College London. * 4. Neither the name of the University nor of the Department may be used *    to endorse or promote products derived from this software without *    specific prior written permission. * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef __RTP_H__#define __RTP_H__#ifndef HAVE_STRUCT_SOCKADDR_STORAGE#include "sockstorage.h"#endif#ifdef __cplusplusextern "C" {#endif  #define RTP_PACKET_HEADER_SIZE	(sizeof(rtp_packet_data))#define RTP_VERSION 2#define RTP_MAX_PACKET_LEN 1500  // moved here by noritypedef int (*rtp_encrypt_f)(void *, uint8_t *, uint32_t *);typedef int (*rtp_decrypt_f)(void *ud, uint8_t *packet_head, uint32_t *packet_len);struct rtp;/* XXX gtkdoc doesn't seem to be able to handle functions that return * struct *'s. */typedef struct rtp *rtp_t;typedef struct rtp_packet_header {#ifdef WORDS_BIGENDIAN	unsigned short   ph_v:2;	/* packet type                */	unsigned short   ph_p:1;	/* padding flag               */	unsigned short   ph_x:1;	/* header extension flag      */	unsigned short   ph_cc:4;	/* CSRC count                 */	unsigned short   ph_m:1;	/* marker bit                 */	unsigned short   ph_pt:7;	/* payload type               */#else	unsigned short   ph_cc:4;	/* CSRC count                 */	unsigned short   ph_x:1;	/* header extension flag      */	unsigned short   ph_p:1;	/* padding flag               */	unsigned short   ph_v:2;	/* packet type                */	unsigned short   ph_pt:7;	/* payload type               */	unsigned short   ph_m:1;	/* marker bit                 */#endif	uint16_t          ph_seq;	/* sequence number            */	uint32_t          ph_ts;	/* timestamp                  */	uint32_t          ph_ssrc;	/* synchronization source     */	/* The csrc list, header extension and data follow, but can't */	/* be represented in the struct.                              */} rtp_packet_header;typedef struct rtp_packet_data {  struct rtp_packet *rtp_pd_next, *rtp_pd_prev;  uint32_t	*rtp_pd_csrc;  uint8_t	*rtp_pd_data;  uint32_t	 rtp_pd_data_len;  uint8_t	*rtp_pd_extn;  uint16_t	 rtp_pd_extn_len; /* Size of the extension in 32 bit words minus one */  uint16_t	 rtp_pd_extn_type;/* Extension type field in the RTP packet header   */  uint8_t       *pd_buf_start;  uint32_t       pd_buflen; /* received buffer len (w/rtp header) */  int            rtp_pd_have_timestamp;  uint64_t       rtp_pd_timestamp;  struct sockaddr_storage rtp_rx_addr;  socklen_t      rtp_rx_addr_len;  rtp_packet_header *ph;} rtp_packet_data;  #define packet_start    pd.pd_buf_start#define packet_length   pd.pd_buflen#define rtp_next      pd.rtp_pd_next#define rtp_prev      pd.rtp_pd_prev#define rtp_csrc      pd.rtp_pd_csrc#define rtp_data      pd.rtp_pd_data#define rtp_data_len  pd.rtp_pd_data_len#define rtp_extn      pd.rtp_pd_extn#define rtp_extn_len  pd.rtp_pd_extn_len#define rtp_extn_type pd.rtp_pd_extn_type  #define rtp_pak_v    pd.ph->ph_v#define rtp_pak_p    pd.ph->ph_p#define rtp_pak_x    pd.ph->ph_x#define rtp_pak_cc   pd.ph->ph_cc#define rtp_pak_m    pd.ph->ph_m#define rtp_pak_pt   pd.ph->ph_pt#define rtp_pak_seq  pd.ph->ph_seq#define rtp_pak_ts   pd.ph->ph_ts#define rtp_pak_ssrc pd.ph->ph_ssrctypedef struct rtp_packet {  /* The following are pointers to the data in the packet as    */  /* it came off the wire. The packet it read in such that the  */  /* header maps onto the latter part of this struct, and the   */  /* fields in this first part of the struct point into it. The */  /* entire packet can be freed by freeing this struct, without */  /* having to free the csrc, data and extn blocks separately.  */  rtp_packet_data pd;  /* The following map directly onto the RTP packet header...   */} rtp_packet;  typedef struct {	uint32_t         ssrc;	uint32_t         ntp_sec;	uint32_t         ntp_frac;	uint32_t         rtp_ts;	uint32_t         sender_pcount;	uint32_t         sender_bcount;} rtcp_sr;typedef struct {	uint32_t	ssrc;		/* The ssrc to which this RR pertains */#ifdef WORDS_BIGENDIAN	uint32_t	fract_lost:8;	uint32_t	total_lost:24;#else	uint32_t	total_lost:24;	uint32_t	fract_lost:8;#endif		uint32_t	last_seq;	uint32_t	jitter;	uint32_t	lsr;	uint32_t	dlsr;} rtcp_rr;typedef struct {#ifdef WORDS_BIGENDIAN	unsigned short  version:2;	/* RTP version            */	unsigned short  p:1;		/* padding flag           */	unsigned short  subtype:5;	/* application dependent  */#else	unsigned short  subtype:5;	/* application dependent  */	unsigned short  p:1;		/* padding flag           */	unsigned short  version:2;	/* RTP version            */#endif	unsigned short  pt:8;		/* packet type            */	uint16_t        length;		/* packet length          */	uint32_t        ssrc;	char            name[4];        /* four ASCII characters  */	char            data[1];        /* variable length field  */} rtcp_app;/* rtp_event type values. */typedef enum {        RX_RTP,        RX_SR,        RX_RR,        RX_SDES,        RX_BYE,         /* Source is leaving the session, database entry is still valid                           */        SOURCE_CREATED,        SOURCE_DELETED, /* Source has been removed from the database                                              */        RX_RR_EMPTY,    /* We've received an empty reception report block                                         */        RX_RTCP_START,  /* Processing a compound RTCP packet about to start. The SSRC is not valid in this event. */        RX_RTCP_FINISH,	/* Processing a compound RTCP packet finished. The SSRC is not valid in this event.       */        RR_TIMEOUT,        RX_APP} rtp_event_type;typedef struct {	uint32_t	 ssrc;	rtp_event_type	 type;	void		*data;	struct timeval	*ts;} rtp_event;/* Callback types */typedef void (*rtp_callback_f)(struct rtp *session, rtp_event *e);typedef rtcp_app* (*rtcp_app_callback_f)(struct rtp *session, uint32_t rtp_ts, uint32_t max_size);typedef int (*send_packet_f)(void *userdata, uint8_t *buffer, uint32_t buflen);typedef int (*send_packet_iov_f)(void *userdata, struct iovec *iov, int count);/* SDES packet types... */typedef enum  {        RTCP_SDES_END   = 0,        RTCP_SDES_CNAME = 1,        RTCP_SDES_NAME  = 2,        RTCP_SDES_EMAIL = 3,        RTCP_SDES_PHONE = 4,        RTCP_SDES_LOC   = 5,        RTCP_SDES_TOOL  = 6,        RTCP_SDES_NOTE  = 7,        RTCP_SDES_PRIV  = 8} rtcp_sdes_type;typedef struct {	uint8_t		type;		/* type of SDES item              */	uint8_t		length;		/* length of SDES item (in bytes) */	char		data[1];	/* text, not zero-terminated      */} rtcp_sdes_item;/* RTP options */typedef enum {        RTP_OPT_PROMISC =	    1,        RTP_OPT_WEAK_VALIDATION	=   2,        RTP_OPT_FILTER_MY_PACKETS = 3} rtp_option;typedef struct socket_udp_ socket_udp; typedef struct rtp_stream_params_t {  const char *rtp_addr;  in_port_t   rtp_rx_port;  in_port_t   rtp_tx_port;  uint8_t     rtp_ttl;  const char *rtcp_addr;  in_port_t   rtcp_rx_port;  in_port_t   rtcp_tx_port;  uint8_t     rtcp_ttl;  const char *physical_interface_addr;  int dont_init_sockets;  // for use with tcp  int transmit_initial_rtcp; // transmit a fast rtcp packet  double rtcp_bandwidth;      socket_udp  *rtp_socket;  // rtp socket to use  socket_udp  *rtcp_socket; // rtcp socket to use  // callbacks  rtp_callback_f rtp_callback;  send_packet_f rtp_send_packet;  send_packet_iov_f rtp_send_packet_iov;  send_packet_f rtcp_send_packet;  // user data  void *send_userdata;  void *recv_userdata;} rtp_stream_params_t;typedef struct rtp_encryption_params_t {  void *userdata;  rtp_encrypt_f rtp_encrypt, rtcp_encrypt;  rtp_decrypt_f rtp_decrypt, rtcp_decrypt;      uint8_t rtp_auth_alloc_extra;  uint8_t rtcp_auth_alloc_extra;} rtp_encryption_params_t;rtp_stream_params_t *rtp_default_params(rtp_stream_params_t *ptr);rtp_t rtp_init_stream(rtp_stream_params_t *param_ptr);  /* API */rtp_t		rtp_init(const char *addr, 			 uint16_t rx_port, uint16_t tx_port, 			 int ttl, double rtcp_bw, 			 rtp_callback_f callback,			 void *recv_userdata);  // rtp_init_xmitter - for transmitters - send an RTCP with the first packetrtp_t		rtp_init_if(const char *addr, char *iface, 			    uint16_t rx_port, uint16_t tx_port, 			    int ttl, double rtcp_bw, 			    rtp_callback_f callback,			    void *recv_userdata,			    int dont_init_sockets);void		 rtp_send_bye(struct rtp *session);void		 rtp_done(struct rtp *session);int 		 rtp_set_option(struct rtp *session, rtp_option optname, int optval);int 		 rtp_get_option(struct rtp *session, rtp_option optname, int *optval);int 		 rtp_recv(struct rtp *session, 			  struct timeval *timeout, uint32_t curr_rtp_ts);  void rtp_recv_data(struct rtp *session, uint32_t curr_rtp_ts);int 		 rtp_send_data(struct rtp *session, 			       uint32_t rtp_ts, int8_t pt, int m, 			       unsigned int cc, uint32_t csrc[],                                uint8_t *data, uint32_t data_len, 			       uint8_t *extn, uint16_t extn_len, uint16_t extn_type);int            rtp_send_data_iov(struct rtp *session, 				 uint32_t rtp_ts, int8_t pt, int m, 				 unsigned int cc, uint32_t csrc[], 				 struct iovec *iov, uint32_t iov_count, 				 uint8_t *extn, uint16_t extn_len, 				 uint16_t extn_type, uint16_t seq_num_add);void 		 rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts, 			       rtcp_app_callback_f appcallback);void 		 rtp_send_ctrl_2(struct rtp *session, uint32_t rtp_ts,				 uint64_t ntp_ts, 				 rtcp_app_callback_f appcallback);void 		 rtp_update(struct rtp *session);uint32_t	 rtp_my_ssrc(struct rtp *session);int		 rtp_add_csrc(struct rtp *session, uint32_t csrc);int		 rtp_del_csrc(struct rtp *session, uint32_t csrc);int		 rtp_set_sdes(struct rtp *session, uint32_t ssrc, 			      rtcp_sdes_type type, 			      const char *value, int length);const char	*rtp_get_sdes(struct rtp *session, uint32_t ssrc, rtcp_sdes_type type);const rtcp_sr	*rtp_get_sr(struct rtp *session, uint32_t ssrc);const rtcp_rr	*rtp_get_rr(struct rtp *session, uint32_t reporter, uint32_t reportee);int              rtp_set_my_ssrc(struct rtp *session, uint32_t ssrc);char 		*rtp_get_addr(struct rtp *session);uint16_t	 rtp_get_rx_port(struct rtp *session);uint16_t	 rtp_get_tx_port(struct rtp *session);int		 rtp_get_ttl(struct rtp *session);void		*rtp_get_recv_userdata(struct rtp *session);  int rtp_process_recv_data(struct rtp *session,			  uint32_t curr_rtp_ts,			  rtp_packet *packet);void rtp_process_ctrl(struct rtp *session, uint8_t *buffer, uint32_t buflen);  int rtp_set_encryption_params (struct rtp *session, rtp_encryption_params_t *params);    int rtp_get_encryption_enabled(struct rtp *session);  socket_udp *get_rtp_data_socket(struct rtp *session);socket_udp *get_rtp_rtcp_socket(struct rtp *session);  void rtp_set_receive_buffer_default_size(int bufsize);    unsigned int rtp_get_mtu_adjustment (struct rtp *session);  void rtp_set_rtp_callback(struct rtp *session, rtp_callback_f rtp,			    void *userdata);#ifdef __cplusplus}#endif#endif /* __RTP_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -