mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session, bool_t full) { mblk_t *mp = allocb(sizeof(rtcp_common_header_t), 0); rtcp_common_header_t *rtcp; mblk_t *tmp; mblk_t *m = mp; mblk_t *sdes; queue_t *q; int rc = 0; sdes = (full == TRUE) ? session->full_sdes : session->minimal_sdes; rtcp = (rtcp_common_header_t *)mp->b_wptr; mp->b_wptr += sizeof(rtcp_common_header_t); /* Concatenate all sdes chunks. */ sdes_chunk_set_ssrc(sdes, session->snd.ssrc); m = concatb(m, dupmsg(sdes)); rc++; if (full == TRUE) { q = &session->contributing_sources; for (tmp = qbegin(q); !qend(q, tmp); tmp = qnext(q, mp)) { m = concatb(m, dupmsg(tmp)); rc++; } } rtcp_common_header_init(rtcp, session, RTCP_SDES, rc, msgdsize(mp)); return mp; }
void ms_yuv_buf_allocator_free(MSYuvBufAllocator *obj) { mblk_t *m; int possibly_leaked = 0; for(m = qbegin(&obj->q); !qend(&obj->q,m); m = qnext(&obj->q, m)){ if (m->b_datap->db_ref > 1) possibly_leaked++; } msgb_allocator_uninit(obj); ms_free(obj); if (possibly_leaked > 0){ ms_warning("ms_yuv_buf_allocator_free(): leaving %i mblk_t still ref'd, possible leak.", possibly_leaked); } }
void rtp_session_remove_contributing_source(RtpSession *session, uint32_t ssrc) { queue_t *q=&session->contributing_sources; mblk_t *tmp; for (tmp=qbegin(q); !qend(q,tmp); tmp=qnext(q,tmp)){ uint32_t csrc=sdes_chunk_get_ssrc(tmp); if (csrc==ssrc) { remq(q,tmp); break; } } tmp=rtcp_create_simple_bye_packet(ssrc, NULL); rtp_session_rtcp_send(session,tmp); }
mblk_t *msgb_allocator_alloc(msgb_allocator_t *a, int size){ queue_t *q=&a->q; mblk_t *m,*found=NULL; /*lookup for an unused msgb (data block with ref count ==1)*/ for(m=qbegin(q);!qend(q,m);m=qnext(q,m)){ if (m->b_datap->db_ref==1 && m->b_datap->db_lim-m->b_datap->db_base>=size){ found=m; break; } } if (found==NULL){ found=allocb(size,0); putq(q,found); } return dupb(found); }
mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session) { mblk_t *mp=allocb(sizeof(rtcp_common_header_t),0); rtcp_common_header_t *rtcp; mblk_t *tmp,*m=mp; queue_t *q; int rc=0; rtcp = (rtcp_common_header_t*)mp->b_wptr; mp->b_wptr+=sizeof(rtcp_common_header_t); /* concatenate all sdes chunks */ sdes_chunk_set_ssrc(session->sd,session->snd.ssrc); m=concatb(m,dupmsg(session->sd)); rc++; q=&session->contributing_sources; for (tmp=qbegin(q); !qend(q,tmp); tmp=qnext(q,mp)){ m=concatb(m,dupmsg(tmp)); rc++; } rtcp_common_header_init(rtcp,session,RTCP_SDES,rc,msgdsize(mp)); return mp; }