#ifndef _OSMO_RTP_H_ #define _OSMO_RTP_H_ #include /* RTP header as defined by RFC 3550 */ struct rtp_hdr { #if OSMO_IS_LITTLE_ENDIAN uint8_t csrc_count:4, extension:1, padding:1, version:2; uint8_t payload_type:7, marker:1; #elif OSMO_IS_BIG_ENDIAN /* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */ uint8_t version:2, padding:1, extension:1, csrc_count:4; uint8_t marker:1, payload_type:7; #endif uint16_t sequence; uint32_t timestamp; uint32_t ssrc; uint8_t data[0]; } __attribute__((packed)); #define RTP_VERSION 2 /* 5.3.1 RTP Header Extension * * If the X bit in the RTP header is one, a variable-length header * extension MUST be appended to the RTP header, following the CSRC list * if present. The header extension contains a 16-bit length field that * counts the number of 32-bit words in the extension, excluding the * four-octet extension header (therefore zero is a valid length). Only * a single extension can be appended to the RTP data header. */ struct rtp_x_hdr { uint16_t by_profile; uint16_t length; } __attribute__((packed)); /* RTPC header. */ struct rtcp_hdr { uint8_t byte0; uint8_t type; uint16_t length; } __attribute__((packed)); /* XXX: RFC specifies that MTU should used, add generic function to obtain existing MTU. */ #define RTP_MSGB_SIZE 1500 struct msgb; struct osmo_rtp_handle *osmo_rtp_handle_create(void *ctx); void osmo_rtp_handle_free(struct osmo_rtp_handle *h); int osmo_rtp_handle_tx_set_sequence(struct osmo_rtp_handle *h, uint16_t seq); int osmo_rtp_handle_tx_set_ssrc(struct osmo_rtp_handle *h, uint32_t ssrc); int osmo_rtp_handle_tx_set_timestamp(struct osmo_rtp_handle *h, uint32_t timestamp); struct rtp_hdr *osmo_rtp_get_hdr(struct msgb *msg); void *osmo_rtp_get_payload(struct rtp_hdr *rtph, struct msgb *msg, uint32_t *plen); struct msgb *osmo_rtp_build(struct osmo_rtp_handle *h, uint8_t payload_type, uint32_t payload_len, const void *data, uint32_t duration); int osmo_rtp_snprintf(char *buf, size_t size, struct msgb *msg); /* supported RTP payload types. */ #define RTP_PT_RTCP 72 /* RFC 3551: 72-76 for RTCP */ #define RTP_PT_GSM_FULL 3 #define RTP_PT_GSM_FULL_PAYLOAD_LEN 33 #define RTP_PT_GSM_FULL_DURATION 160 /* in samples. */ #define RTP_PT_GSM_HALF 96 #define RTP_PT_GSM_EFR 97 #define RTP_PT_GSM_EFR_PAYLOAD_LEN 31 #define RTP_PT_GSM_EFR_DURATION 160 /* in samples. */ #define RTP_PT_AMR 98 #define RTP_PT_CSDATA 120 /* 3GPP TS 48.103 table 5.4.2.2.1 */ #endif