PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses, const pjmedia_rtp_hdr *hdr, pjmedia_rtp_status *p_seq_st) { pjmedia_rtp_session_update2(ses, hdr, p_seq_st, PJ_TRUE); }
static void read_rtp(pj_uint8_t *buf, pj_size_t bufsize, pjmedia_rtp_hdr **rtp, pj_uint8_t **payload, unsigned *payload_size, pj_bool_t check_pt) { pj_status_t status; /* Init RTP session */ if (!app.rtp_sess_init) { T(pjmedia_rtp_session_init(&app.rtp_sess, 0, 0)); app.rtp_sess_init = PJ_TRUE; } /* Loop reading until we have a good RTP packet */ for (;;) { pj_size_t sz = bufsize; const pjmedia_rtp_hdr *r; const void *p; pjmedia_rtp_status seq_st; status = pj_pcap_read_udp(app.pcap, NULL, buf, &sz); if (status != PJ_SUCCESS) err_exit("Error reading PCAP file", status); /* Decode RTP packet to make sure that this is an RTP packet. * We will decode it again to get the payload after we do * SRTP decoding */ status = pjmedia_rtp_decode_rtp(&app.rtp_sess, buf, (int)sz, &r, &p, payload_size); if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); printf("Not RTP packet, skipping packet: %s\n", errmsg); continue; } /* Decrypt SRTP */ #if PJMEDIA_HAS_SRTP if (app.srtp) { int len = (int)sz; status = pjmedia_transport_srtp_decrypt_pkt(app.srtp, PJ_TRUE, buf, &len); if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); printf("SRTP packet decryption failed, skipping packet: %s\n", errmsg); continue; } sz = len; /* Decode RTP packet again */ status = pjmedia_rtp_decode_rtp(&app.rtp_sess, buf, (int)sz, &r, &p, payload_size); if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(status, errmsg, sizeof(errmsg)); printf("Not RTP packet, skipping packet: %s\n", errmsg); continue; } } #endif /* Update RTP session */ pjmedia_rtp_session_update2(&app.rtp_sess, r, &seq_st, PJ_FALSE); /* Skip out-of-order packet */ if (seq_st.diff == 0) { printf("Skipping out of order packet\n"); continue; } /* Skip if payload type is different */ if (check_pt && r->pt != app.pt) { printf("Skipping RTP packet with bad payload type\n"); continue; } /* Skip bad packet */ if (seq_st.status.flag.bad) { printf("Skipping bad RTP\n"); continue; } *rtp = (pjmedia_rtp_hdr*)r; *payload = (pj_uint8_t*)p; /* We have good packet */ break; } }