static int32_t rtp_sinker_consume(network_sinker *ns, proto_watch *pw, int32_t stm_i, msg *m, uint32_t seq) { int32_t ret = -ENOMEM; media_sinker *sinker = (media_sinker*)ns; rtp_sinker *rs = (rtp_sinker*)ns; media_sinker *ms = (media_sinker*)ns; mem_block *mb; network_client *nc = (network_client*)rs->interleaved; if (rs->trans_mode == RTP_OVER_UDP) { BUG_ON(!pw); proto_watch_ref(pw); RELEASE_LOCK(sinker->lock); msg_ref(m); ret = proto_watch_write(pw, m, seq, 0); proto_watch_unref(pw); AQUIRE_LOCK(sinker->lock); return ret; } mb = rtp_msg_to_interleaved_mb(m, ns->stms[stm_i].interleaved); if (mb) { MEMBLOCK_SET_SEQ(mb, seq); if (rs->trans_mode == RTP_OVER_TCP) { BUG_ON(!pw); proto_watch_ref(pw); RELEASE_LOCK(sinker->lock); msg_ref(m); ret = proto_watch_write_mb(pw, mb, 0); proto_watch_unref(pw); AQUIRE_LOCK(sinker->lock); } else { BUG_ON(!nc); RELEASE_LOCK(ms->lock); msg_ref(m); ret = network_client_send_mb(nc, mb, 0); AQUIRE_LOCK(ms->lock); } } return ret; }
/* FIXME */ inline void msg_decr(struct msg *msg) { msg_ref(msg, -1); }
/* FIXME */ inline void msg_incr(struct msg *msg) { msg_ref(msg, 1); }