57 lines
1.2 KiB
C++
57 lines
1.2 KiB
C++
// RFC3550 6.7 APP: Application-Defined RTCP Packet
|
|
|
|
#include "rtp-internal.h"
|
|
#include "rtp-util.h"
|
|
|
|
void rtcp_app_unpack(struct rtp_context *ctx, const rtcp_header_t *header, const uint8_t* ptr, size_t bytes)
|
|
{
|
|
struct rtcp_msg_t msg;
|
|
//struct rtp_member *member;
|
|
|
|
if (bytes < 8) // RTCP header + SSRC + name
|
|
{
|
|
assert(0);
|
|
return;
|
|
}
|
|
|
|
msg.ssrc = nbo_r32(ptr);
|
|
msg.type = RTCP_APP;
|
|
|
|
//member = rtp_member_fetch(ctx, msg.ssrc);
|
|
//if(!member) return; // error
|
|
|
|
msg.u.app.subtype = header->rc;
|
|
memcpy(msg.u.app.name, ptr+4, 4);
|
|
msg.u.app.data = (void*)(ptr + 8);
|
|
msg.u.app.bytes = (int)bytes - 8;
|
|
|
|
ctx->handler.on_rtcp(ctx->cbparam, &msg);
|
|
}
|
|
|
|
int rtcp_app_pack(struct rtp_context *ctx, uint8_t* ptr, int bytes, const char name[4], const void* app, int len)
|
|
{
|
|
rtcp_header_t header;
|
|
|
|
if(bytes >= 12 + (len+3)/4*4)
|
|
{
|
|
header.v = 2;
|
|
header.p = 0;
|
|
header.pt = RTCP_APP;
|
|
header.rc = 0;
|
|
header.length = (uint16_t)(2+(len+3)/4);
|
|
nbo_write_rtcp_header(ptr, &header);
|
|
|
|
nbo_w32(ptr+4, ctx->self->ssrc);
|
|
memcpy(ptr+8, name, 4);
|
|
|
|
if (len > 0)
|
|
{
|
|
memcpy(ptr + 12, app, len);
|
|
if(0 != len % 4)
|
|
memset(ptr + 12 + len, 0, 4 - (len % 4));
|
|
}
|
|
}
|
|
|
|
return 12 + (len+3)/4*4;
|
|
}
|