73 lines
1.4 KiB
C++
73 lines
1.4 KiB
C++
#include "rtp-member.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
struct rtp_member* rtp_member_create(uint32_t ssrc)
|
|
{
|
|
struct rtp_member* p;
|
|
p = (struct rtp_member*)calloc(1, sizeof(struct rtp_member));
|
|
if(!p)
|
|
return NULL;
|
|
|
|
p->ref = 1;
|
|
p->ssrc = ssrc;
|
|
p->jitter = 0.0;
|
|
p->rtp_probation = RTP_PROBATION;
|
|
p->rtcp_sr.ssrc = ssrc;
|
|
//p->rtcp_rb.ssrc = ssrc;
|
|
return p;
|
|
}
|
|
|
|
void rtp_member_addref(struct rtp_member *member)
|
|
{
|
|
assert(member->ref > 0);
|
|
++member->ref;
|
|
}
|
|
|
|
void rtp_member_release(struct rtp_member *member)
|
|
{
|
|
size_t i;
|
|
assert(member->ref > 0);
|
|
if(0 == --member->ref)
|
|
{
|
|
for(i = 0; i < sizeof(member->sdes)/sizeof(member->sdes[0]); i++)
|
|
{
|
|
if(member->sdes[i].data)
|
|
{
|
|
assert(member->sdes[i].pt == i);
|
|
assert(member->sdes[i].len > 0);
|
|
free(member->sdes[i].data);
|
|
}
|
|
}
|
|
|
|
free(member);
|
|
}
|
|
}
|
|
|
|
int rtp_member_setvalue(struct rtp_member *member, int item, const uint8_t* data, int bytes)
|
|
{
|
|
rtcp_sdes_item_t *sdes;
|
|
assert(RTCP_SDES_CNAME <= item && item <= RTCP_SDES_PRIVATE);
|
|
if(item >= sizeof(member->sdes)/sizeof(member->sdes[0]) || bytes > 255)
|
|
return -1;
|
|
|
|
sdes = &member->sdes[item];
|
|
|
|
if(bytes > sdes->len)
|
|
{
|
|
void* p = realloc(sdes->data, bytes);
|
|
if(!p)
|
|
return -1; // no memory
|
|
sdes->data = p;
|
|
}
|
|
|
|
assert(bytes <= 255);
|
|
if (bytes > 0)
|
|
memcpy(sdes->data, data, bytes);
|
|
sdes->pt = (uint8_t)item;
|
|
sdes->len = (uint8_t)bytes;
|
|
return 0;
|
|
}
|