Esempio n. 1
0
void* rtp_create(struct rtp_event_t *handler, void* param, uint32_t ssrc, int frequence, int boundwidth)
{
	struct rtp_context *ctx;

	ctx = (struct rtp_context *)calloc(1, sizeof(*ctx));
	if(!ctx) return NULL;

	ctx->self = rtp_member_create(ssrc);
	ctx->members = rtp_member_list_create();
	ctx->senders = rtp_member_list_create();
	if(!ctx->self || !ctx->members || !ctx->senders)
	{
		rtp_destroy(ctx);
		return NULL;
	}

	rtp_member_list_add(ctx->members, ctx->self);

	memcpy(&ctx->handler, handler, sizeof(ctx->handler));
	ctx->cbparam = param;
	ctx->rtcp_bw = (size_t)(boundwidth * RTCP_BANDWIDTH_FRACTION);
	ctx->avg_rtcp_size = 0;
	ctx->frequence = frequence;
	ctx->role = RTP_RECEIVER;
	ctx->init = 1;
	return ctx;
}
Esempio n. 2
0
struct rtp_member* rtp_member_fetch(struct rtp_context *ctx, uint32_t ssrc)
{
	struct rtp_member *p;
	p = rtp_member_list_find(ctx->members, ssrc);
	if(!p)
	{
		// exist in sender list?
		assert(!rtp_member_list_find(ctx->senders, ssrc));

		p = rtp_member_create(ssrc);
		if(p)
		{
			struct rtcp_msg_t msg;

			// update members list
			rtp_member_list_add(ctx->members, p);
			rtp_member_release(p);

			msg.type = RTCP_MSG_MEMBER;
			msg.u.member.ssrc = ssrc;
			ctx->handler.on_rtcp(ctx->cbparam, &msg);
		}
	}
	return p;
}
Esempio n. 3
0
struct rtp_member* rtp_sender_fetch(struct rtp_context *ctx, uint32_t ssrc)
{
	struct rtp_member *p;
	p = rtp_member_list_find(ctx->senders, ssrc);
	if(!p)
	{
		p = rtp_member_fetch(ctx, ssrc);
		if(p)
		{
			// update senders list
			rtp_member_list_add(ctx->senders, p);
		}
	}
	return p;
}