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:
parent
0c97d53814
commit
45930a5de6
|
@ -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:
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue