![]() |
Home page |
Mailing list |
Docs
Asterisk developer's documentation :: Codename Pineapple
rtp.c File Reference
Definition in file rtp.c.
#include "asterisk.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include "asterisk/rtp.h"
#include "asterisk/frame.h"
#include "asterisk/logger.h"
#include "asterisk/options.h"
#include "asterisk/channel.h"
#include "asterisk/acl.h"
#include "asterisk/config.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
#include "asterisk/cli.h"
#include "asterisk/unaligned.h"
Include dependency graph for rtp.c:

Go to the source code of this file.
Data Structures | |
| struct | __attribute__ |
| struct | ast_rtcp |
| Structure defining an RTCP session. More... | |
| struct | ast_rtp |
| RTP session description. More... | |
| struct | rtpPayloadType |
| Structure representing a RTP session.The value of each payload format mapping:. More... | |
| struct | stun_addr |
| struct | stun_attr |
| struct | stun_header |
| struct | stun_state |
Defines | |
| #define | DEFAULT_DTMF_TIMEOUT 3000 |
| #define | FLAG_3389_WARNING (1 << 0) |
| #define | FLAG_CALLBACK_MODE (1 << 6) |
| #define | FLAG_DTMF_COMPENSATE (1 << 7) |
| #define | FLAG_HAS_DTMF (1 << 3) |
| #define | FLAG_HAS_STUN (1 << 8) |
| #define | FLAG_NAT_ACTIVE (3 << 1) |
| #define | FLAG_NAT_INACTIVE (0 << 1) |
| #define | FLAG_NAT_INACTIVE_NOWARN (1 << 1) |
| #define | FLAG_P2P_NEED_DTMF (1 << 5) |
| #define | FLAG_P2P_SENT_MARK (1 << 4) |
| #define | MAX_TIMESTAMP_SKEW 640 |
| #define | RTCP_DEFAULT_INTERVALMS 5000 |
| #define | RTCP_MAX_INTERVALMS 60000 |
| #define | RTCP_MIN_INTERVALMS 500 |
| #define | RTCP_PT_APP 204 |
| #define | RTCP_PT_BYE 203 |
| #define | RTCP_PT_FUR 192 |
| #define | RTCP_PT_RR 201 |
| #define | RTCP_PT_SDES 202 |
| #define | RTCP_PT_SR 200 |
| #define | RTP_MTU 1200 |
| #define | RTP_SEQ_MOD (1<<16) |
| #define | STUN_ACCEPT (1) |
| #define | STUN_BINDERR 0x0111 |
| #define | STUN_BINDREQ 0x0001 |
| #define | STUN_BINDRESP 0x0101 |
| #define | STUN_CHANGE_REQUEST 0x0003 |
| #define | STUN_CHANGED_ADDRESS 0x0005 |
| #define | STUN_ERROR_CODE 0x0009 |
| #define | STUN_IGNORE (0) |
| #define | STUN_MAPPED_ADDRESS 0x0001 |
| #define | STUN_MESSAGE_INTEGRITY 0x0008 |
| #define | STUN_PASSWORD 0x0007 |
| #define | STUN_REFLECTED_FROM 0x000b |
| #define | STUN_RESPONSE_ADDRESS 0x0002 |
| #define | STUN_SECERR 0x0112 |
| #define | STUN_SECREQ 0x0002 |
| #define | STUN_SECRESP 0x0102 |
| #define | STUN_SOURCE_ADDRESS 0x0004 |
| #define | STUN_UNKNOWN_ATTRIBUTES 0x000a |
| #define | STUN_USERNAME 0x0006 |
Functions | |
| static void | append_attr_address (struct stun_attr **attr, int attrval, struct sockaddr_in *sin, int *len, int *left) |
| static void | append_attr_string (struct stun_attr **attr, int attrval, const char *s, int *len, int *left) |
| static unsigned int | ast_rtcp_calc_interval (struct ast_rtp *rtp) |
| int | ast_rtcp_fd (struct ast_rtp *rtp) |
| static struct ast_rtcp * | ast_rtcp_new (void) |
| Initialize a new RTCP session. | |
| ast_frame * | ast_rtcp_read (struct ast_rtp *rtp) |
| int | ast_rtcp_send_h261fur (void *data) |
| Send an H.261 fast update request. Some devices need this rather than the XML message in SIP. | |
| static int | ast_rtcp_write (void *data) |
| Write and RTCP packet to the far end. | |
| static int | ast_rtcp_write_rr (void *data) |
| Send RTCP recipient's report. | |
| static int | ast_rtcp_write_sr (void *data) |
| Send RTCP sender's report. | |
| size_t | ast_rtp_alloc_size (void) |
| Get the amount of space required to hold an RTP session. | |
| enum ast_bridge_result | ast_rtp_bridge (struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms) |
| The RTP bridge. | |
| int | ast_rtp_codec_getformat (int pt) |
| ast_codec_pref * | ast_rtp_codec_getpref (struct ast_rtp *rtp) |
| int | ast_rtp_codec_setpref (struct ast_rtp *rtp, struct ast_codec_pref *prefs) |
| void | ast_rtp_destroy (struct ast_rtp *rtp) |
| int | ast_rtp_early_bridge (struct ast_channel *c0, struct ast_channel *c1) |
| If possible, create an early bridge directly between the devices without having to send a re-invite later. | |
| int | ast_rtp_fd (struct ast_rtp *rtp) |
| ast_rtp * | ast_rtp_get_bridged (struct ast_rtp *rtp) |
| void | ast_rtp_get_current_formats (struct ast_rtp *rtp, int *astFormats, int *nonAstFormats) |
| Return the union of all of the codecs that were set by rtp_set...() calls They're returned as two distinct sets: AST_FORMATs, and AST_RTPs. | |
| int | ast_rtp_get_peer (struct ast_rtp *rtp, struct sockaddr_in *them) |
| char * | ast_rtp_get_quality (struct ast_rtp *rtp) |
| int | ast_rtp_get_rtpholdtimeout (struct ast_rtp *rtp) |
| Get rtp hold timeout. | |
| int | ast_rtp_get_rtpkeepalive (struct ast_rtp *rtp) |
| Get RTP keepalive interval. | |
| int | ast_rtp_get_rtptimeout (struct ast_rtp *rtp) |
| Get rtp timeout. | |
| void | ast_rtp_get_us (struct ast_rtp *rtp, struct sockaddr_in *us) |
| int | ast_rtp_getnat (struct ast_rtp *rtp) |
| void | ast_rtp_init (void) |
| Return RTCP quality string. | |
| int | ast_rtp_lookup_code (struct ast_rtp *rtp, const int isAstFormat, const int code) |
| Looks up an RTP code out of our *static* outbound list. | |
| char * | ast_rtp_lookup_mime_multiple (char *buf, size_t size, const int capability, const int isAstFormat, enum ast_rtp_options options) |
| Build a string of MIME subtype names from a capability list. | |
| const char * | ast_rtp_lookup_mime_subtype (const int isAstFormat, const int code, enum ast_rtp_options options) |
| Mapping an Asterisk code into a MIME subtype (string):. | |
| rtpPayloadType | ast_rtp_lookup_pt (struct ast_rtp *rtp, int pt) |
| Mapping between RTP payload format codes and Asterisk codes:. | |
| int | ast_rtp_make_compatible (struct ast_channel *dest, struct ast_channel *src, int media) |
| ast_rtp * | ast_rtp_new (struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode) |
| Initializate a RTP session. | |
| void | ast_rtp_new_init (struct ast_rtp *rtp) |
| Initialize a new RTP structure. | |
| ast_rtp * | ast_rtp_new_with_bindaddr (struct sched_context *sched, struct io_context *io, int rtcpenable, int callbackmode, struct in_addr addr) |
| Initializate a RTP session using an in_addr structure. | |
| int | ast_rtp_proto_register (struct ast_rtp_protocol *proto) |
| Register an RTP channel client. | |
| void | ast_rtp_proto_unregister (struct ast_rtp_protocol *proto) |
| Unregister an RTP channel client. | |
| void | ast_rtp_pt_clear (struct ast_rtp *rtp) |
| Setting RTP payload types from lines in a SDP description:. | |
| void | ast_rtp_pt_copy (struct ast_rtp *dest, struct ast_rtp *src) |
| Copy payload types between RTP structures. | |
| void | ast_rtp_pt_default (struct ast_rtp *rtp) |
| Set payload types to defaults. | |
| static int | ast_rtp_raw_write (struct ast_rtp *rtp, struct ast_frame *f, int codec) |
| Write RTP packet with audio or video media frames into UDP packet. | |
| ast_frame * | ast_rtp_read (struct ast_rtp *rtp) |
| int | ast_rtp_reload (void) |
| void | ast_rtp_reset (struct ast_rtp *rtp) |
| int | ast_rtp_sendcng (struct ast_rtp *rtp, int level) |
| generate comfort noice (CNG) | |
| int | ast_rtp_senddigit_begin (struct ast_rtp *rtp, char digit) |
| Send begin frames for DTMF. | |
| static int | ast_rtp_senddigit_continuation (struct ast_rtp *rtp) |
| Send continuation frame for DTMF. | |
| int | ast_rtp_senddigit_end (struct ast_rtp *rtp, char digit) |
| Send end packets for DTMF. | |
| void | ast_rtp_set_callback (struct ast_rtp *rtp, ast_rtp_callback callback) |
| void | ast_rtp_set_data (struct ast_rtp *rtp, void *data) |
| void | ast_rtp_set_m_type (struct ast_rtp *rtp, int pt) |
| Make a note of a RTP payload type that was seen in a SDP "m=" line. By default, use the well-known value for this type (although it may still be set to a different value by a subsequent "a=rtpmap:" line). | |
| void | ast_rtp_set_peer (struct ast_rtp *rtp, struct sockaddr_in *them) |
| void | ast_rtp_set_rtpholdtimeout (struct ast_rtp *rtp, int timeout) |
| Set rtp hold timeout. | |
| void | ast_rtp_set_rtpkeepalive (struct ast_rtp *rtp, int period) |
| set RTP keepalive interval | |
| void | ast_rtp_set_rtpmap_type (struct ast_rtp *rtp, int pt, char *mimeType, char *mimeSubtype, enum ast_rtp_options options) |
| Make a note of a RTP payload type (with MIME type) that was seen in an SDP "a=rtpmap:" line. | |
| void | ast_rtp_set_rtptimeout (struct ast_rtp *rtp, int timeout) |
| Set rtp timeout. | |
| void | ast_rtp_set_rtptimers_onhold (struct ast_rtp *rtp) |
| void | ast_rtp_setdtmf (struct ast_rtp *rtp, int dtmf) |
| Indicate whether this RTP session is carrying DTMF or not. | |
| void | ast_rtp_setdtmfcompensate (struct ast_rtp *rtp, int compensate) |
| Compensate for devices that send RFC2833 packets all at once. | |
| void | ast_rtp_setnat (struct ast_rtp *rtp, int nat) |
| void | ast_rtp_setstun (struct ast_rtp *rtp, int stun_enable) |
| Enable STUN capability. | |
| int | ast_rtp_settos (struct ast_rtp *rtp, int tos) |
| void | ast_rtp_stop (struct ast_rtp *rtp) |
| void | ast_rtp_stun_request (struct ast_rtp *rtp, struct sockaddr_in *suggestion, const char *username) |
| Send STUN request (??). | |
| int | ast_rtp_write (struct ast_rtp *rtp, struct ast_frame *_f) |
| static | AST_RWLIST_HEAD_STATIC (protos, ast_rtp_protocol) |
| List of current sessions. | |
| static enum ast_bridge_result | bridge_native_loop (struct ast_channel *c0, struct ast_channel *c1, struct ast_rtp *p0, struct ast_rtp *p1, struct ast_rtp *vp0, struct ast_rtp *vp1, struct ast_rtp_protocol *pr0, struct ast_rtp_protocol *pr1, int codec0, int codec1, int timeoutms, int flags, struct ast_frame **fo, struct ast_channel **rc, void *pvt0, void *pvt1) |
| Bridge loop for true native bridge (reinvite). | |
| static enum ast_bridge_result | bridge_p2p_loop (struct ast_channel *c0, struct ast_channel *c1, struct ast_rtp *p0, struct ast_rtp *p1, int timeoutms, int flags, struct ast_frame **fo, struct ast_channel **rc, void *pvt0, void *pvt1) |
| Bridge loop for partial native bridge (packet2packet). | |
| static int | bridge_p2p_rtp_write (struct ast_rtp *rtp, struct ast_rtp *bridged, unsigned int *rtpheader, int len, int hdrlen) |
| Perform a Packet2Packet RTP write. | |
| static void | calc_rxstamp (struct timeval *tv, struct ast_rtp *rtp, unsigned int timestamp, int mark) |
| static unsigned int | calc_txstamp (struct ast_rtp *rtp, struct timeval *delivery) |
| static struct ast_rtp_protocol * | get_proto (struct ast_channel *chan) |
| Get channel driver interface structure. | |
| static int | p2p_callback_disable (struct ast_channel *chan, struct ast_rtp *rtp, int **iod) |
| Helper function to switch a channel and RTP stream out of callback mode. | |
| static int | p2p_callback_enable (struct ast_channel *chan, struct ast_rtp *rtp, int **iod) |
| P2P RTP Callback. | |
| static void | p2p_set_bridge (struct ast_rtp *rtp0, struct ast_rtp *rtp1) |
| Helper function that sets what an RTP structure is bridged to. | |
| static struct ast_frame * | process_cisco_dtmf (struct ast_rtp *rtp, unsigned char *data, int len) |
| static struct ast_frame * | process_rfc2833 (struct ast_rtp *rtp, unsigned char *data, int len, unsigned int seqno) |
| Process RTP DTMF and events according to RFC 2833. | |
| static struct ast_frame * | process_rfc3389 (struct ast_rtp *rtp, unsigned char *data, int len) |
| Process Comfort Noise RTP. | |
| static int | rtcp_debug_test_addr (struct sockaddr_in *addr) |
| static int | rtcp_do_debug (int fd, int argc, char *argv[]) |
| static int | rtcp_do_debug_ip (int fd, int argc, char *argv[]) |
| static int | rtcp_do_stats (int fd, int argc, char *argv[]) |
| static int | rtcp_no_debug (int fd, int argc, char *argv[]) |
| static int | rtcp_no_stats (int fd, int argc, char *argv[]) |
| static void | rtp_bridge_lock (struct ast_rtp *rtp) |
| static void | rtp_bridge_unlock (struct ast_rtp *rtp) |
| static int | rtp_debug_test_addr (struct sockaddr_in *addr) |
| static int | rtp_do_debug (int fd, int argc, char *argv[]) |
| static int | rtp_do_debug_ip (int fd, int argc, char *argv[]) |
| static int | rtp_no_debug (int fd, int argc, char *argv[]) |
| static int | rtp_socket (void) |
| Open RTP or RTCP socket for a session. | |
| static int | rtpread (int *id, int fd, short events, void *cbdata) |
| static struct ast_frame * | send_dtmf (struct ast_rtp *rtp, enum ast_frame_type type) |
| static const char * | stun_attr2str (int msg) |
| static int | stun_do_debug (int fd, int argc, char *argv[]) |
| static int | stun_handle_packet (int s, struct sockaddr_in *src, unsigned char *data, size_t len) |
| static const char * | stun_msg2str (int msg) |
| static int | stun_no_debug (int fd, int argc, char *argv[]) |
| static int | stun_process_attr (struct stun_state *state, struct stun_attr *attr) |
| static void | stun_req_id (struct stun_header *req) |
| static int | stun_send (int s, struct sockaddr_in *dst, struct stun_header *resp) |
| static void | timeval2ntp (struct timeval tv, unsigned int *msw, unsigned int *lsw) |
Variables | |
| static struct ast_cli_entry | cli_rtp [] |
| static const char | debug_usage [] |
| static int | dtmftimeout = DEFAULT_DTMF_TIMEOUT |
| struct { | |
| int alarm | |
| const char * description | |
| unsigned int event_log:1 | |
| char * ext | |
| char * mtype | |
| char * name | |
| const char * name | |
| rtpPayloadType payloadType | |
| unsigned int queue_log:1 | |
| char * subtype | |
| char * type | |
| int val | |
| } | mimeTypes [] |
| static const char | no_debug_usage [] |
| stun_addr | packed |
| stun_attr | packed |
| stun_header | packed |
| static const char | rtcp_debug_usage [] |
| static const char | rtcp_no_debug_usage [] |
| static const char | rtcp_no_stats_usage [] |
| static const char | rtcp_stats_usage [] |
| static int | rtcpdebug |
| static struct sockaddr_in | rtcpdebugaddr |
| static int | rtcpinterval = RTCP_DEFAULT_INTERVALMS |
| static int | rtcpstats |
| static int | rtpdebug |
| static struct sockaddr_in | rtpdebugaddr |
| static int | rtpend |
| static int | rtpstart |
| static struct rtpPayloadType | static_RTP_PT [MAX_RTP_PT] |
| static const char | stun_debug_usage [] |
| static const char | stun_no_debug_usage [] |
| static int | stundebug |
|
|
samples Definition at line 76 of file rtp.c. Referenced by ast_rtp_reload(). |
|
|
Definition at line 188 of file rtp.c. Referenced by process_rfc3389(). |
|
|
Definition at line 195 of file rtp.c. Referenced by p2p_callback_disable(). |
|
|
Definition at line 196 of file rtp.c. Referenced by ast_rtp_setdtmfcompensate(), process_cisco_dtmf(), process_rfc2833(), and send_dtmf(). |
|
|
Definition at line 192 of file rtp.c. Referenced by ast_rtp_bridge(), ast_rtp_new_init(), and ast_rtp_setdtmf(). |
|
|
Definition at line 197 of file rtp.c. Referenced by ast_rtp_setstun(). |
|
|
Definition at line 189 of file rtp.c. Referenced by ast_rtp_early_bridge(), ast_rtp_getnat(), ast_rtp_make_compatible(), ast_rtp_raw_write(), ast_rtp_read(), bridge_native_loop(), and bridge_p2p_rtp_write(). |
|
|
Definition at line 190 of file rtp.c. Referenced by ast_rtp_raw_write(), and bridge_p2p_rtp_write(). |
|
|
Definition at line 191 of file rtp.c. Referenced by ast_rtp_raw_write(), and bridge_p2p_rtp_write(). |
|
|
Definition at line 194 of file rtp.c. Referenced by ast_rtp_bridge(), and bridge_p2p_rtp_write(). |
|
|
Definition at line 193 of file rtp.c. Referenced by ast_rtp_stop(), bridge_p2p_loop(), and bridge_p2p_rtp_write(). |
|
|
Definition at line 60 of file rtp.c. Referenced by ast_rtp_raw_write(), calc_timestamp(), and calc_txpeerstamp(). |
|
|
Default milli-seconds between RTCP reports we send |
|
|
Max milli-seconds between RTCP reports we send Definition at line 65 of file rtp.c. Referenced by ast_rtp_reload(). |
|
|
Min milli-seconds between RTCP reports we send Definition at line 64 of file rtp.c. Referenced by ast_rtp_reload(). |
|
|
|
|
|
Definition at line 71 of file rtp.c. Referenced by ast_rtcp_read(). |
|
|
Definition at line 67 of file rtp.c. Referenced by ast_rtcp_read(), ast_rtcp_write_rr(), and ast_rtcp_write_sr(). |
|
|
Definition at line 69 of file rtp.c. Referenced by ast_rtcp_read(), and ast_rtcp_write_rr(). |
|
|
Definition at line 70 of file rtp.c. Referenced by ast_rtcp_read(), ast_rtcp_write_rr(), and ast_rtcp_write_sr(). |
|
|
Definition at line 68 of file rtp.c. Referenced by ast_rtcp_read(), and ast_rtcp_write_sr(). |
|
|
|
|
|
A sequence number can't be more than 16 bits Definition at line 62 of file rtp.c. Referenced by ast_rtp_read(). |
|
|
Definition at line 261 of file rtp.c. Referenced by ast_rtp_read(), and stun_handle_packet(). |
|
|
Definition at line 265 of file rtp.c. Referenced by stun_msg2str(). |
|
|
Definition at line 263 of file rtp.c. Referenced by ast_rtp_stun_request(), stun_handle_packet(), and stun_msg2str(). |
|
|
Definition at line 264 of file rtp.c. Referenced by stun_handle_packet(), and stun_msg2str(). |
|
|
Definition at line 272 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 274 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 278 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 260 of file rtp.c. Referenced by stun_handle_packet(). |
|
|
Definition at line 270 of file rtp.c. Referenced by stun_attr2str(), and stun_handle_packet(). |
|
|
Definition at line 277 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 276 of file rtp.c. Referenced by stun_attr2str(), and stun_process_attr(). |
|
|
Definition at line 280 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 271 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 268 of file rtp.c. Referenced by stun_msg2str(). |
|
|
Definition at line 266 of file rtp.c. Referenced by stun_msg2str(). |
|
|
Definition at line 267 of file rtp.c. Referenced by stun_msg2str(). |
|
|
Definition at line 273 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 279 of file rtp.c. Referenced by stun_attr2str(). |
|
|
Definition at line 275 of file rtp.c. Referenced by ast_rtp_stun_request(), stun_attr2str(), stun_handle_packet(), and stun_process_attr(). |
|
||||||||||||||||||||||||
|
Definition at line 368 of file rtp.c. References stun_addr::addr. Referenced by stun_handle_packet(). 00369 { 00370 int size = sizeof(**attr) + 8; 00371 struct stun_addr *addr; 00372 if (*left > size) { 00373 (*attr)->attr = htons(attrval); 00374 (*attr)->len = htons(8); 00375 addr = (struct stun_addr *)((*attr)->value); 00376 addr->unused = 0; 00377 addr->family = 0x01; 00378 addr->port = sin->sin_port; 00379 addr->addr = sin->sin_addr.s_addr; 00380 (*attr) = (struct stun_attr *)((*attr)->value + 8); 00381 *len += size; 00382 *left -= size; 00383 } 00384 }
|
|
||||||||||||||||||||||||
|
Definition at line 355 of file rtp.c. Referenced by ast_rtp_stun_request(), and stun_handle_packet(). 00356 { 00357 int size = sizeof(**attr) + strlen(s); 00358 if (*left > size) { 00359 (*attr)->attr = htons(attrval); 00360 (*attr)->len = htons(strlen(s)); 00361 memcpy((*attr)->value, s, strlen(s)); 00362 (*attr) = (struct stun_attr *)((*attr)->value + strlen(s)); 00363 *len += size; 00364 *left -= size; 00365 } 00366 }
|
|
|
Definition at line 526 of file rtp.c. Referenced by ast_rtp_raw_write(), and ast_rtp_read(). 00527 { 00528 unsigned int interval; 00529 /*! \todo XXX Do a more reasonable calculation on this one 00530 * Look in RFC 3550 Section A.7 for an example*/ 00531 interval = rtcpinterval; 00532 return interval; 00533 }
|
|
|
Definition at line 519 of file rtp.c. References ast_rtp::rtcp, and ast_rtcp::s. Referenced by __oh323_new(), __oh323_rtp_create(), __oh323_update_info(), gtalk_new(), jingle_new(), sip_new(), and start_rtp().
|
|
|
Initialize a new RTCP session.
Definition at line 1873 of file rtp.c. References ast_calloc, ast_log(), free, LOG_WARNING, rtp_socket(), and ast_rtcp::s. Referenced by ast_rtp_new_with_bindaddr(). 01874 { 01875 struct ast_rtcp *rtcp; 01876 01877 if (!(rtcp = ast_calloc(1, sizeof(*rtcp)))) 01878 return NULL; 01879 rtcp->s = rtp_socket(); 01880 rtcp->us.sin_family = AF_INET; 01881 rtcp->them.sin_family = AF_INET; 01882 01883 if (rtcp->s < 0) { 01884 free(rtcp); 01885 ast_log(LOG_WARNING, "Unable to allocate RTCP socket: %s\n", strerror(errno)); 01886 return NULL; 01887 } 01888 01889 return rtcp; 01890 }
|
|
|
Definition at line 888 of file rtp.c. References ast_rtcp::accumulated_transit, AST_CONTROL_VIDUPDATE, AST_FRAME_CONTROL, AST_FRIENDLY_OFFSET, ast_inet_ntoa(), ast_log(), ast_null_frame, ast_verbose(), CRASH, ast_frame::datalen, ast_rtp::f, ast_frame::frametype, len, LOG_DEBUG, LOG_WARNING, ast_frame::mallocd, ast_rtcp::maxrtt, ast_rtcp::minrtt, ast_rtp::nat, option_debug, ast_rtcp::reported_jitter, ast_rtcp::reported_lost, ast_rtp::rtcp, rtcp_debug_test_addr(), RTCP_PT_BYE, RTCP_PT_FUR, RTCP_PT_RR, RTCP_PT_SDES, RTCP_PT_SR, ast_rtcp::rtt, ast_rtcp::rxlsr, ast_rtcp::s, ast_frame::samples, ast_rtcp::soc, ast_rtcp::spc, ast_frame::src, ast_frame::subclass, ast_rtcp::them, ast_rtcp::themrxlsr, and timeval2ntp(). Referenced by oh323_read(), sip_rtp_read(), and skinny_rtp_read(). 00889 { 00890 socklen_t len; 00891 int position, i, packetwords; 00892 int res; 00893 struct sockaddr_in sin; 00894 unsigned int rtcpdata[8192 + AST_FRIENDLY_OFFSET]; 00895 unsigned int *rtcpheader; 00896 int pt; 00897 struct timeval now; 00898 unsigned int length; 00899 int rc; 00900 double rtt = 0; 00901 double a; 00902 double dlsr; 00903 double lsr; 00904 unsigned int msw; 00905 unsigned int lsw; 00906 unsigned int comp; 00907 struct ast_frame *f = &ast_null_frame; 00908 00909 if (!rtp || !rtp->rtcp) 00910 return &ast_null_frame; 00911 00912 len = sizeof(sin); 00913 00914 res = recvfrom(rtp->rtcp->s, rtcpdata + AST_FRIENDLY_OFFSET, sizeof(rtcpdata) - sizeof(unsigned int) * AST_FRIENDLY_OFFSET, 00915 0, (struct sockaddr *)&sin, &len); 00916 rtcpheader = (unsigned int *)(rtcpdata + AST_FRIENDLY_OFFSET); 00917 00918 if (res < 0) { 00919 if (errno != EAGAIN) 00920 ast_log(LOG_WARNING, "RTCP Read error: %s\n", strerror(errno)); 00921 if (errno == EBADF) 00922 CRASH; 00923 return &ast_null_frame; 00924 } |