void jitter_control_update_size(JitterControl *ctl, queue_t *q){ mblk_t *newest=qlast(q); mblk_t *oldest=qbegin(q); uint32_t newest_ts,oldest_ts; if (newest==NULL) return; newest_ts=rtp_get_timestamp(newest); oldest_ts=rtp_get_timestamp(oldest); ctl->cum_jitter_buffer_count++; ctl->cum_jitter_buffer_size+=(uint32_t)(newest_ts-oldest_ts); }
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 void receiver_process(MSFilter * f) { ReceiverData *d = (ReceiverData *) f->data; mblk_t *m; uint32_t timestamp; if (d->session == NULL) return; 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_payload_type(m, rtp_get_payload_type(m)); rtp_get_payload(m,&m->b_rptr); ms_queue_put(f->outputs[0], m); } }
int main(int argc, char **argv) { MastTool* tool = NULL; mblk_t* packet = NULL; mblk_t* body = NULL; PayloadType* pt = NULL; int payload_size = 0; // Create an RTP session tool = new MastTool( MAST_TOOL_NAME, RTP_SESSION_RECVONLY ); if (tool==NULL) return -1; // Parse the command line arguments // and configure the session parse_cmd_line( argc, argv, tool->get_session() ); // Setup signal handlers mast_setup_signals(); // Recieve a single packet packet = tool->wait_for_rtp_packet(); if (packet == NULL) MAST_FATAL("Failed to receive a packet"); body = packet->b_cont; payload_size = (body->b_wptr - body->b_rptr); // Display information about the packet received printf("\n"); printf("RTP Header\n"); printf("==========\n"); printf("Payload type : %u\n", rtp_get_payload_type( packet ) ); printf("Payload size : %u bytes\n", payload_size ); printf("Sequence Number : %u\n", rtp_get_seqnumber( packet ) ); printf("Timestamp : %u\n", rtp_get_timestamp( packet ) ); printf("SSRC Identifier : %x\n", rtp_get_ssrc( packet ) ); printf("Marker Bit : %s\n", rtp_get_markbit( packet ) ? "Set" : "Not Set"); printf("\n"); // Lookup the payload type pt = rtp_profile_get_payload( tool->get_profile(), rtp_get_payload_type( packet ) ); if (pt == NULL) { MAST_WARNING( "Payload type %u isn't registered with oRTP", rtp_get_payload_type( packet ) ); } else { const char* mime_major = "?"; printf("Payload Details\n"); printf("===============\n"); if (pt->type==PAYLOAD_AUDIO_CONTINUOUS) mime_major = "audio"; else if (pt->type==PAYLOAD_AUDIO_PACKETIZED) mime_major = "audio"; else if (pt->type==PAYLOAD_VIDEO) mime_major = "video"; printf("Mime Type : %s/%s\n", mime_major, pt->mime_type); if (pt->clock_rate) printf("Clock Rate : %u Hz\n", pt->clock_rate); if (pt->channels) printf("Channels : %u\n", pt->channels); if (pt->bits_per_sample) printf("Bits per Sample : %u\n", pt->bits_per_sample); if (pt->normal_bitrate) { printf("Normal Bitrate : %u kbps\n", (pt->normal_bitrate/1000)); printf("Packet duration : %u ms\n", (payload_size*1000)/(pt->normal_bitrate/8) ); } if (pt->recv_fmtp) printf("Recieve FMTP : %s\n", pt->recv_fmtp); if (pt->send_fmtp) printf("Send FMTP : %s\n", pt->send_fmtp); printf("\n"); } // Parse the MPEG Audio header if (rtp_get_payload_type( packet ) == RTP_MPEG_AUDIO_PT) { /* FIXME: check fragment offset header (see rfc2250) */ unsigned char* mpa_ptr = body->b_rptr + 4; MPA_Header mh; printf("MPEG Audio Header\n"); printf("=================\n"); if (!mh.parse( mpa_ptr )) { MAST_WARNING("Failed to parse MPEG Audio header"); } else { mh.debug( stdout ); } } // Close RTP session delete tool; // Success ! return 0; }
static void PacketRecv( block_t *p_block, uint64_t i_date ) { uint64_t i_scaled_timestamp; if ( !rtp_check_hdr( p_block->p_data ) ) { msg_Warn( NULL, "non-RTP packet received" ); free( p_block ); return; } BuildTimestamp( rtp_get_timestamp( p_block->p_data ) ); switch ( rtp_get_type( p_block->p_data ) ) { case RTP_TYPE_TS: /* 90 kHz */ i_scaled_timestamp = i_last_timestamp * 300; break; default: /* assume milliseconds */ i_scaled_timestamp = i_last_timestamp * 27000; break; } if ( i_date ) clock_NewRef( i_scaled_timestamp, i_date ); p_block->i_date = clock_ToWall( i_scaled_timestamp ) + i_buffer_length; p_block->i_seqnum = rtp_get_seqnum( p_block->p_data ); /* Insert the block at the correct position */ if ( p_last == NULL ) { p_first = p_last = p_block; p_block->p_prev = p_block->p_next = NULL; } else { block_t *p_prev = p_last; while ( p_prev != NULL && ((UINT16_MAX * 3 / 2 + (int32_t)p_prev->i_seqnum - (int32_t)p_block->i_seqnum) % UINT16_MAX - UINT16_MAX / 2) > 0 ) p_prev = p_prev->p_prev; if ( p_prev == NULL ) { p_block->p_next = p_first; p_first->p_prev = p_block; p_block->p_prev = NULL; p_first = p_block; } else { p_block->p_prev = p_prev; p_block->p_next = p_prev->p_next; p_prev->p_next = p_block; if ( p_block->p_next != NULL ) p_block->p_next->p_prev = p_block; else p_last = p_block; } } }