aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/netif/rtp.h2
-rw-r--r--src/rtp.c40
2 files changed, 42 insertions, 0 deletions
diff --git a/include/osmocom/netif/rtp.h b/include/osmocom/netif/rtp.h
index 4b290c6..1854d6c 100644
--- a/include/osmocom/netif/rtp.h
+++ b/include/osmocom/netif/rtp.h
@@ -62,6 +62,8 @@ void *osmo_rtp_get_payload(struct rtp_hdr *rtph, struct msgb *msg, uint32_t *ple
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 */
diff --git a/src/rtp.c b/src/rtp.c
index 7cd5a0e..6245194 100644
--- a/src/rtp.c
+++ b/src/rtp.c
@@ -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;
+}