Ticket #478: Handle duplicated/misordered incoming DTMF packets

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1798 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Benny Prijono 2008-02-14 19:45:47 +00:00
parent 0c97d53814
commit 45930a5de6
3 changed files with 51 additions and 8 deletions

View File

@ -301,6 +301,26 @@ PJ_DECL(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses,
pjmedia_rtp_status *seq_st);
/**
* Call this function everytime an RTP packet is received to check whether
* the packet can be received and to let the RTP session performs its internal
* calculations.
*
* @param ses The session.
* @param hdr The RTP header of the incoming packet. The header must
* be given with fields in network byte order.
* @param seq_st Optional structure to receive the status of the RTP packet
* processing.
* @param check_pt Flag to indicate whether payload type needs to be validate.
*
* @see pjmedia_rtp_session_update()
*/
PJ_DECL(void) pjmedia_rtp_session_update2(pjmedia_rtp_session *ses,
const pjmedia_rtp_hdr *hdr,
pjmedia_rtp_status *seq_st,
pj_bool_t check_pt);
/*
* INTERNAL:
*/

View File

@ -160,9 +160,23 @@ PJ_DEF(pj_status_t) pjmedia_rtp_decode_rtp( pjmedia_rtp_session *ses,
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);
}
PJ_DEF(void) pjmedia_rtp_session_update2( pjmedia_rtp_session *ses,
const pjmedia_rtp_hdr *hdr,
pjmedia_rtp_status *p_seq_st,
pj_bool_t check_pt)
{
pjmedia_rtp_status seq_st;
/* for now check_pt MUST be either PJ_TRUE or PJ_FALSE.
* In the future we might change check_pt from boolean to
* unsigned integer to accommodate more flags.
*/
pj_assert(check_pt==PJ_TRUE || check_pt==PJ_FALSE);
/* Init status */
seq_st.status.value = 0;
seq_st.diff = 0;
@ -176,7 +190,7 @@ PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses,
}
/* Check payload type. */
if (hdr->pt != ses->out_pt) {
if (check_pt && hdr->pt != ses->out_pt) {
if (p_seq_st) {
p_seq_st->status.value = seq_st.status.value;
p_seq_st->status.flag.bad = 1;
@ -205,6 +219,7 @@ PJ_DEF(void) pjmedia_rtp_session_update( pjmedia_rtp_session *ses,
}
void pjmedia_rtp_seq_restart(pjmedia_rtp_seq_session *sess, pj_uint16_t seq)
{
sess->base_seq = seq;

View File

@ -960,16 +960,11 @@ static void on_rx_rtp( void *data,
if (channel->paused)
return;
/* Handle incoming DTMF. */
if (hdr->pt == stream->rx_event_pt) {
handle_incoming_dtmf(stream, payload, payloadlen);
return;
}
/* Update RTP session (also checks if RTP session can accept
* the incoming packet.
*/
pjmedia_rtp_session_update(&channel->rtp, hdr, &seq_st);
pjmedia_rtp_session_update2(&channel->rtp, hdr, &seq_st,
hdr->pt != stream->rx_event_pt);
if (seq_st.status.value) {
TRC_ ((stream->port.info.name.ptr,
"RTP status: badpt=%d, badssrc=%d, dup=%d, "
@ -996,6 +991,19 @@ static void on_rx_rtp( void *data,
if (payloadlen == 0)
return;
/* Handle incoming DTMF. */
if (hdr->pt == stream->rx_event_pt) {
/* Ignore out-of-order packet as it will be detected as new
* digit. Also ignore duplicate packet as it serves no use.
*/
if (seq_st.status.flag.outorder || seq_st.status.flag.dup) {
return;
}
handle_incoming_dtmf(stream, payload, payloadlen);
return;
}
/* Put "good" packet to jitter buffer, or reset the jitter buffer
* when RTP session is restarted.
*/