rtp-rtcp定义的结构

来源:互联网 发布:linux下安装nginx 编辑:程序博客网 时间:2024/05/24 02:37

//Download by http://www.NewXing.com
/*
 * FILE:   cclrtp.h
 * AUTHOR: Colin Perkins <c.perkins@cs.ucl.ac.uk>
 *
 * $Revision: 1.56 $
 * $Date: 2001/04/15 16:15:49 $
 *
 * 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__

#define RTP_VERSION 2
#define RTP_PACKET_HEADER_SIZE ((sizeof(char *) * 2) + sizeof(uint32_t *) + (2 * sizeof(int)))
#define RTP_MAX_PACKET_LEN 1500

#if !defined(WORDS_BIGENDIAN) && !defined(WORDS_SMALLENDIAN)
#error RTP library requires WORDS_BIGENDIAN or WORDS_SMALLENDIAN to be defined.
#endif

struct rtp;

/* XXX gtkdoc doesn't seem to be able to handle functions that return
 * struct *'s. */
typedef struct rtp *rtp_t;

typedef struct {
 /* 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.  */
 /* WARNING: Don't change the size of the first portion of the */
 /* struct without changing RTP_PACKET_HEADER_SIZE to match.   */
 uint32_t *csrc;
 char  *data;
 int   data_len;
 unsigned char *extn;
 uint16_t  extn_len; /* Size of the extension in 32 bit words minus one */
 uint16_t  extn_type; /* Extension type field in the RTP packet header   */
 /* The following map directly onto the RTP packet header...   */
#ifdef WORDS_BIGENDIAN
 unsigned short   v:2;  /* packet type                */
 unsigned short   p:1;  /* padding flag               */
 unsigned short   x:1;  /* header extension flag      */
 unsigned short   cc:4;  /* CSRC count                 */
 unsigned short   m:1;  /* marker bit                 */
 unsigned short   pt:7;  /* payload type               */
#else
 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                 */
#endif
 uint16_t          seq;  /* sequence number            */
 uint32_t          ts;  /* timestamp                  */
 uint32_t          ssrc;  /* synchronization source     */
 /* The csrc list, header extension and data follow, but can't */
 /* be represented in the struct.                              */
} 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)(struct rtp *session, rtp_event *e);
typedef rtcp_app* (*rtcp_app_callback)(struct rtp *session, uint32_t rtp_ts, int max_size);

/* 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;

/* API */
rtp_t  rtp_init(const char *addr,
    uint16_t rx_port, uint16_t tx_port,
    int ttl, double rtcp_bw,
    rtp_callback callback,
    uint8_t *userdata);
rtp_t  rtp_init_if(const char *addr, char *iface,
       uint16_t rx_port, uint16_t tx_port,
       int ttl, double rtcp_bw,
       rtp_callback callback,
       uint8_t *userdata);

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);
int    rtp_send_data(struct rtp *session,
          uint32_t rtp_ts, char pt, int m,
          int cc, uint32_t csrc[],
                               char *data, int data_len,
          char *extn, uint16_t extn_len, uint16_t extn_type);
void    rtp_send_ctrl(struct rtp *session, uint32_t rtp_ts,
          rtcp_app_callback 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_encryption_key(struct rtp *session, const char *passphrase);
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);
uint8_t  *rtp_get_userdata(struct rtp *session);

#endif /* __RTP_H__ */

原创粉丝点击