stream-deploy/ZLM/3rdpart/media-server/librtp/source/rtcp-app.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;
}