]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 289798 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Sat, 2 Oct 2010 02:43:45 +0000 (02:43 +0000)
committerJeff Peeler <jpeeler@digium.com>
Sat, 2 Oct 2010 02:43:45 +0000 (02:43 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.6.2

................
  r289798 | jpeeler | 2010-10-01 18:01:31 -0500 (Fri, 01 Oct 2010) | 22 lines

  Merged revisions 289797 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r289797 | jpeeler | 2010-10-01 17:58:38 -0500 (Fri, 01 Oct 2010) | 15 lines

    Change RFC2833 DTMF event duration on end to report actual elapsed time.

    The scenario here is with a non P2P early media session. The reported time
    length of DTMF presses are coming up short when sending to the remote side.
    Currently the event duration is a running total that is incremented when sending
    continuation packets. These continuation packets are only triggered upon
    incoming media from the remote side, which means that the running total probably
    is not going to end up matching the actual length of time Asterisk received
    DTMF. This patch changes the end event duration to be lengthened if it is
    detected that the end event is going to come up short.

    Review: https://reviewboard.asterisk.org/r/957/

    ABE-2476
  ........
................

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@289840 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
include/asterisk/rtp_engine.h
main/rtp_engine.c
res/res_rtp_asterisk.c

index 80a215cc3d1e48becb99ce37a8e082dc530084cb..3772c5a681c06ad1f02daf2c90f62b90c7a685fe 100644 (file)
@@ -6188,7 +6188,7 @@ static int sip_senddigit_end(struct ast_channel *ast, char digit, unsigned int d
                break;
        case SIP_DTMF_RFC2833:
                if (p->rtp)
-                       ast_rtp_instance_dtmf_end(p->rtp, digit);
+                       ast_rtp_instance_dtmf_end_with_duration(p->rtp, digit, duration);
                break;
        case SIP_DTMF_INBAND:
                if (p->rtp && ast_rtp_instance_dtmf_mode_get(p->rtp) == AST_RTP_DTMF_MODE_INBAND) {
index 0a2fe772608831c9a3c7199cbdb5bbe46a7eff33..74ea34668c8bb7d7a511d712a163fbbb2186e634 100644 (file)
@@ -324,6 +324,7 @@ struct ast_rtp_engine {
        int (*dtmf_begin)(struct ast_rtp_instance *instance, char digit);
        /*! Callback for stopping RFC2833 DTMF transmission */
        int (*dtmf_end)(struct ast_rtp_instance *instance, char digit);
+       int (*dtmf_end_with_duration)(struct ast_rtp_instance *instance, char digit, unsigned int duration);
        /*! Callback to indicate that we should update the marker bit */
        void (*update_source)(struct ast_rtp_instance *instance);
        /*! Callback to indicate that we should update the marker bit and ssrc */
@@ -1162,6 +1163,7 @@ int ast_rtp_instance_dtmf_begin(struct ast_rtp_instance *instance, char digit);
  * \since 1.8
  */
 int ast_rtp_instance_dtmf_end(struct ast_rtp_instance *instance, char digit);
+int ast_rtp_instance_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration);
 
 /*!
  * \brief Set the DTMF mode that should be used
index 9fe5c5a623829f943a29c39d9dd4bd3edb0582fb..ff8ebd4813baff72263d4133481e225d2202ff09 100644 (file)
@@ -724,6 +724,10 @@ int ast_rtp_instance_dtmf_end(struct ast_rtp_instance *instance, char digit)
 {
        return instance->engine->dtmf_end ? instance->engine->dtmf_end(instance, digit) : -1;
 }
+int ast_rtp_instance_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
+{
+       return instance->engine->dtmf_end_with_duration ? instance->engine->dtmf_end_with_duration(instance, digit, duration) : -1;
+}
 
 int ast_rtp_instance_dtmf_mode_set(struct ast_rtp_instance *instance, enum ast_rtp_dtmf_mode dtmf_mode)
 {
index 643794890be71c61a96ea8394b7f10b7aed0ef46..ffd7b2596aed56028b083231cdb7ff822516d5fa 100644 (file)
@@ -255,6 +255,7 @@ static int ast_rtp_new(struct ast_rtp_instance *instance, struct sched_context *
 static int ast_rtp_destroy(struct ast_rtp_instance *instance);
 static int ast_rtp_dtmf_begin(struct ast_rtp_instance *instance, char digit);
 static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit);
+static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration);
 static void ast_rtp_update_source(struct ast_rtp_instance *instance);
 static void ast_rtp_change_source(struct ast_rtp_instance *instance);
 static int ast_rtp_write(struct ast_rtp_instance *instance, struct ast_frame *frame);
@@ -279,6 +280,7 @@ static struct ast_rtp_engine asterisk_rtp_engine = {
        .destroy = ast_rtp_destroy,
        .dtmf_begin = ast_rtp_dtmf_begin,
        .dtmf_end = ast_rtp_dtmf_end,
+       .dtmf_end_with_duration = ast_rtp_dtmf_end_with_duration,
        .update_source = ast_rtp_update_source,
        .change_source = ast_rtp_change_source,
        .write = ast_rtp_write,
@@ -639,13 +641,14 @@ static int ast_rtp_dtmf_continuation(struct ast_rtp_instance *instance)
        return 0;
 }
 
-static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
+static int ast_rtp_dtmf_end_with_duration(struct ast_rtp_instance *instance, char digit, unsigned int duration)
 {
        struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
        struct ast_sockaddr remote_address = { {0,} };
        int hdrlen = 12, res = 0, i = 0;
        char data[256];
        unsigned int *rtpheader = (unsigned int*)data;
+       unsigned int measured_samples;
 
        ast_rtp_instance_get_remote_address(instance, &remote_address);
 
@@ -672,6 +675,11 @@ static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
 
        rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
 
+       if (duration > 0 && (measured_samples = duration * rtp_get_rate(rtp->f.subclass.codec) / 1000) > rtp->send_duration) {
+               ast_debug(2, "Adjusting final end duration from %u to %u\n", rtp->send_duration, measured_samples);
+               rtp->send_duration = measured_samples;
+       }
+
        /* Construct the packet we are going to send */
        rtpheader[0] = htonl((2 << 30) | (1 << 23) | (rtp->send_payload << 16) | (rtp->seqno));
        rtpheader[1] = htonl(rtp->lastdigitts);
@@ -703,6 +711,11 @@ static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
        return 0;
 }
 
+static int ast_rtp_dtmf_end(struct ast_rtp_instance *instance, char digit)
+{
+       return ast_rtp_dtmf_end_with_duration(instance, digit, 0);
+}
+
 static void ast_rtp_update_source(struct ast_rtp_instance *instance)
 {
        struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);