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; }
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; }
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; }