static void receiver_process(MSFilter * f) { ReceiverData *d = (ReceiverData *) f->data; mblk_t *m; uint32_t timestamp; if (d->session == NULL) return; if (d->reset_jb){ ms_message("Reseting jitter buffer"); rtp_session_resync(d->session); d->reset_jb=FALSE; } if (d->starting){ PayloadType *pt=rtp_profile_get_payload( rtp_session_get_profile(d->session), rtp_session_get_recv_payload_type(d->session)); if (pt && pt->type!=PAYLOAD_VIDEO) rtp_session_flush_sockets(d->session); d->starting=FALSE; } timestamp = (uint32_t) (f->ticker->time * (d->rate/1000)); while ((m = rtp_session_recvm_with_ts(d->session, timestamp)) != NULL) { mblk_set_timestamp_info(m, rtp_get_timestamp(m)); mblk_set_marker_info(m, rtp_get_markbit(m)); mblk_set_cseq(m, rtp_get_seqnumber(m)); rtp_get_payload(m,&m->b_rptr); ms_queue_put(f->outputs[0], m); } }
static int receiver_set_session(MSFilter * f, void *arg) { ReceiverData *d = (ReceiverData *) f->data; RtpSession *s = (RtpSession *) arg; PayloadType *pt = rtp_profile_get_payload(rtp_session_get_profile(s), rtp_session_get_recv_payload_type (s)); if (pt != NULL) { d->rate = pt->clock_rate; } else { ms_warning("Receiving undefined payload type %i ?", rtp_session_get_recv_payload_type(s)); } d->session = s; return 0; }
static void receiver_preprocess(MSFilter * f){ ReceiverData *d = (ReceiverData *) f->data; if (d->session){ PayloadType *pt=rtp_profile_get_payload( rtp_session_get_profile(d->session), rtp_session_get_recv_payload_type(d->session)); if (pt){ if (pt->type!=PAYLOAD_VIDEO) rtp_session_flush_sockets(d->session); } } }
static int receiver_get_ch(MSFilter *f, void *arg) { ReceiverData *d = (ReceiverData *)f->data; PayloadType *pt; if (d->session==NULL) { ms_warning("MSRtpRecv: Could not obtain sample rate, session is not set."); return -1; } pt=rtp_profile_get_payload(rtp_session_get_profile(d->session), rtp_session_get_recv_payload_type(d->session)); if (pt == NULL) { ms_warning("MSRtpRecv: could not obtain number of channels, payload type is unknown."); return -1; } *(int *)arg = pt->channels; return 0; }
static mblk_t * make_rtcp_fb_rpsi(RtpSession *session, uint8_t *bit_string, uint16_t bit_string_len) { uint16_t bit_string_len_in_bytes; int additional_bytes; int size; mblk_t *h; rtcp_common_header_t *ch; rtcp_fb_header_t *fbh; rtcp_fb_rpsi_fci_t *fci; int i; /* Calculate packet size and allocate memory. */ bit_string_len_in_bytes = (bit_string_len / 8) + (((bit_string_len % 8) == 0) ? 0 : 1); additional_bytes = bit_string_len_in_bytes - 2; if (additional_bytes < 0) additional_bytes = 0; size = sizeof(rtcp_common_header_t) + sizeof(rtcp_fb_header_t) + sizeof(rtcp_fb_rpsi_fci_t) + additional_bytes; h = allocb(size, 0); /* Fill RPSI */ ch = (rtcp_common_header_t *)h->b_wptr; h->b_wptr += sizeof(rtcp_common_header_t); fbh = (rtcp_fb_header_t *)h->b_wptr; h->b_wptr += sizeof(rtcp_fb_header_t); fci = (rtcp_fb_rpsi_fci_t *)h->b_wptr; h->b_wptr += sizeof(rtcp_fb_rpsi_fci_t); fbh->packet_sender_ssrc = htonl(rtp_session_get_send_ssrc(session)); fbh->media_source_ssrc = htonl(rtp_session_get_recv_ssrc(session)); if (bit_string_len <= 16) { fci->pb = 16 - bit_string_len; memset(&fci->bit_string, 0, 2); } else { fci->pb = (bit_string_len - 16) % 32; memset(&fci->bit_string, 0, bit_string_len_in_bytes); } fci->payload_type = rtp_session_get_recv_payload_type(session) & 0x7F; memcpy(&fci->bit_string, bit_string, bit_string_len / 8); for (i = 0; i < (bit_string_len % 8); i++) { fci->bit_string[bit_string_len_in_bytes - 1] |= (bit_string[bit_string_len_in_bytes - 1] & (1 << (7 - i))); } /* Fill common header */ rtcp_common_header_init(ch, session, RTCP_PSFB, RTCP_PSFB_RPSI, msgdsize(h)); return h; }
static int receiver_get_sr(MSFilter *f, void *arg){ ReceiverData *d = (ReceiverData *) f->data; PayloadType *pt; if (d->session==NULL) { ms_warning("Could not obtain sample rate, session is not set."); return -1; } pt=rtp_profile_get_payload(rtp_session_get_profile(d->session), rtp_session_get_recv_payload_type(d->session)); if (pt != NULL) { if (strcasecmp(pt->mime_type,"G722")==0) *(int*)arg=16000; else *(int*)arg=pt->clock_rate; }else{ ms_warning("Could not obtain sample rate, payload type is unknown."); return -1; } return 0; }
void mediastream_payload_type_changed(RtpSession *session, unsigned long data) { MediaStream *stream = (MediaStream *)data; int pt = rtp_session_get_recv_payload_type(stream->sessions.rtp_session); media_stream_change_decoder(stream, pt); }
static void payload_type_changed(RtpSession *session, unsigned long data){ VideoStream *stream=(VideoStream*)data; int pt=rtp_session_get_recv_payload_type(stream->session); video_stream_change_decoder(stream,pt); }