diff options
Diffstat (limited to 'src/rtp.c')
-rw-r--r-- | src/rtp.c | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -184,3 +184,43 @@ osmo_rtp_build(struct osmo_rtp_handle *h, uint8_t payload_type, return msg; } + +#define SNPRINTF_BUFFER_SIZE(ret, size, len, offset) \ + size += ret; \ + if (ret > len) \ + ret = len; \ + offset += ret; \ + len -= ret; + +int osmo_rtp_snprintf(char *buf, size_t size, struct msgb *msg) +{ + struct rtp_hdr *rtph; + int ret, i; + uint8_t *payload; + unsigned int len = size, offset = 0; + + rtph = osmo_rtp_get_hdr(msg); + if (rtph == NULL) + return -1; + + payload = (uint8_t *)rtph + sizeof(struct rtp_hdr); + + ret = snprintf(buf, len, "RTP ver=%01u ssrc=%u type=%02u " + "marker=%01u ext=%01u csrc_count=%01u " + "sequence=%u timestamp=%u [", rtph->version, + ntohl(rtph->ssrc), rtph->payload_type, + rtph->marker, rtph->extension, + rtph->csrc_count, ntohs(rtph->sequence), + ntohl(rtph->timestamp)); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + for (i=0; i<msg->len - sizeof(struct rtp_hdr); i++) { + ret = snprintf(buf+offset, len, "%02x ", payload[i]); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + } + + ret = snprintf(buf+offset, len, "]"); + SNPRINTF_BUFFER_SIZE(ret, size, len, offset); + + return ret; +} |