PayloadType * rtp_profile_find_payload(RtpProfile *prof,const char *mime,int rate,int channels) { int i; i=rtp_profile_find_payload_number(prof,mime,rate,channels); if (i>=0) return rtp_profile_get_payload(prof,i); return NULL; }
static void process_cn(MSFilter *f, SenderData *d){ if (d->cng_data.datasize>0){ rtp_header_t *rtp; /* get CN payload type number */ int cn_pt=rtp_profile_find_payload_number(d->session->snd.profile, "CN", 8000, 1); /* create the packet, payload type number is the one used for current codec */ mblk_t *m=rtp_session_create_packet(d->session, 12, d->cng_data.data, d->cng_data.datasize); /* replace payload type in RTP header */ rtp=(rtp_header_t*)m->b_rptr; rtp->paytype = cn_pt; rtp_session_sendm_with_ts(d->session,m,d->last_ts); d->cng_data.datasize=0; } }
/** * Allocates a new rtp packet to be used to add named telephony events. The application can use * then rtp_session_add_telephone_event() to add named events to the packet. * Finally the packet has to be sent with rtp_session_sendm_with_ts(). * * @param session a rtp session. * @param start boolean to indicate if the marker bit should be set. * * @return a message block containing the rtp packet if successfull, NULL if the rtp session * cannot support telephony event (because the rtp profile it is bound to does not include * a telephony event payload type). **/ mblk_t *rtp_session_create_telephone_event_packet(RtpSession *session, int start) { mblk_t *mp; rtp_header_t *rtp; PayloadType *cur_pt=rtp_profile_get_payload(session->snd.profile, rtp_session_get_send_payload_type(session)); int tev_pt = session->tev_send_pt; if (tev_pt != -1){ PayloadType *cur_tev_pt=rtp_profile_get_payload(session->snd.profile, tev_pt); if (!cur_tev_pt){ ortp_error("Undefined telephone-event payload type %i choosen for sending telephone event", tev_pt); tev_pt = -1; }else if (cur_pt && cur_tev_pt->clock_rate != cur_pt->clock_rate){ ortp_warning("Telephone-event payload type %i has clockrate %i while main audio codec has clockrate %i: this is not permitted.", tev_pt, cur_tev_pt->clock_rate, cur_pt->clock_rate); } } if (tev_pt == -1){ tev_pt = rtp_profile_find_payload_number(session->snd.profile, "telephone-event", cur_pt ? cur_pt->clock_rate : 8000, 1); } return_val_if_fail(tev_pt!=-1,NULL); mp=allocb(RTP_FIXED_HEADER_SIZE+TELEPHONY_EVENTS_ALLOCATED_SIZE,BPRI_MED); if (mp==NULL) return NULL; rtp=(rtp_header_t*)mp->b_rptr; rtp->version = 2; rtp->markbit=start; rtp->padbit = 0; rtp->extbit = 0; rtp->cc = 0; rtp->ssrc = session->snd.ssrc; /* timestamp set later, when packet is sended */ /*seq number set later, when packet is sended */ /*set the payload type */ rtp->paytype=tev_pt; /*copy the payload */ mp->b_wptr+=RTP_FIXED_HEADER_SIZE; return mp; }
int rtp_profile_get_payload_number_from_rtpmap(RtpProfile *profile,const char *rtpmap) { int clock_rate, channels, ret; char* subtype = ortp_strdup( rtpmap ); char* rate_str = NULL; char* chan_str = NULL; /* find the slash after the subtype */ rate_str = strchr(subtype, '/'); if (rate_str && strlen(rate_str)>1) { *rate_str = 0; rate_str++; /* Look for another slash */ chan_str = strchr(rate_str, '/'); if (chan_str && strlen(chan_str)>1) { *chan_str = 0; chan_str++; } else { chan_str = NULL; } } else { rate_str = NULL; } // Use default clock rate if none given if (rate_str) clock_rate = atoi(rate_str); else clock_rate = 8000; // Use default number of channels if none given if (chan_str) channels = atoi(chan_str); else channels = -1; //printf("Searching for payload %s at freq %i with %i channels\n",subtype,clock_rate,ch1annels); ret=rtp_profile_find_payload_number(profile,subtype,clock_rate,channels); ortp_free(subtype); return ret; }