aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/app_fax.c21
-rw-r--r--channels/chan_sip.c14
-rw-r--r--include/asterisk/frame.h2
3 files changed, 27 insertions, 10 deletions
diff --git a/apps/app_fax.c b/apps/app_fax.c
index fffcf8cd5..54928791a 100644
--- a/apps/app_fax.c
+++ b/apps/app_fax.c
@@ -459,7 +459,7 @@ static int transmit_audio(fax_session *s)
.version = 0,
.max_datagram = 400,
.rate = AST_T38_RATE_9600,
- .rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF,
+ .rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF,
.fill_bit_removal = 1,
.transcoding_mmr = 1,
};
@@ -476,7 +476,6 @@ static int transmit_audio(fax_session *s)
that a frame in old format was already queued before we set chanel format
to slinear so it will still be received by ast_read */
if (inf->frametype == AST_FRAME_VOICE && inf->subclass == AST_FORMAT_SLINEAR) {
-
if (fax_rx(&fax, inf->data.ptr, inf->samples) < 0) {
/* I know fax_rx never returns errors. The check here is for good style only */
ast_log(LOG_WARNING, "fax_rx returned error\n");
@@ -497,6 +496,24 @@ static int transmit_audio(fax_session *s)
ast_debug(1, "T38 negotiated, finishing audio loop\n");
res = 1;
break;
+ } else if (parameters->request_response == AST_T38_REQUEST_NEGOTIATE) {
+ if (parameters->version > 0) {
+ /* Only T.38 Version 0 is supported at this time */
+ parameters->version = 0;
+ }
+ if (parameters->max_datagram > 400) {
+ /* Limit incoming datagram size to our default */
+ /* TODO: this need to come from the udptl stack, not be hardcoded */
+ parameters->max_datagram = 400;
+ }
+ /* we only support bit rates up to 9.6kbps */
+ parameters->rate = AST_T38_RATE_9600;
+ ast_indicate_data(s->chan, AST_CONTROL_T38_PARAMETERS, parameters, sizeof(*parameters));
+ /* T38 switchover completed */
+ s->t38parameters = *parameters;
+ ast_debug(1, "T38 negotiated, finishing audio loop\n");
+ res = 1;
+ break;
}
}
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index f88182027..d51aa2601 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1411,7 +1411,7 @@ struct sip_auth {
#define T38FAX_TRANSCODING_MMR (1 << 1) /*!< Default: 0 (unset)*/
#define T38FAX_TRANSCODING_JBIG (1 << 2) /*!< Default: 0 (unset)*/
/* Rate management */
-#define T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF (0 << 3)
+#define T38FAX_RATE_MANAGEMENT_TRANSFERRED_TCF (0 << 3)
#define T38FAX_RATE_MANAGEMENT_LOCAL_TCF (1 << 3) /*!< Unset for transferredTCF (UDPTL), set for localTCF (TPKT) */
/* UDP Error correction */
#define T38FAX_UDP_EC_NONE (0 << 4) /*!< two bits, if unset NO t38UDPEC field in T38 SDP*/
@@ -4710,8 +4710,8 @@ static void fill_t38_parameters(int capabilities, struct ast_control_t38_paramet
parameters->rate = AST_T38_RATE_2400;
}
- if (capabilities & T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF) {
- parameters->rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF;
+ if (capabilities & T38FAX_RATE_MANAGEMENT_TRANSFERRED_TCF) {
+ parameters->rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF;
} else if (capabilities & T38FAX_RATE_MANAGEMENT_LOCAL_TCF) {
parameters->rate_management = AST_T38_RATE_MANAGEMENT_LOCAL_TCF;
}
@@ -4806,7 +4806,7 @@ static void set_t38_capabilities(struct sip_pvt *p)
ast_udptl_set_error_correction_scheme(p->udptl, UDPTL_ERROR_CORRECTION_NONE);
p->t38.capability |= T38FAX_UDP_EC_NONE;
}
- p->t38.capability |= T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF;
+ p->t38.capability |= T38FAX_RATE_MANAGEMENT_TRANSFERRED_TCF;
}
}
@@ -6176,8 +6176,8 @@ static void interpret_t38_parameters(struct sip_pvt *p, enum ast_control_t38 req
p->t38.capability = p->t38.jointcapability |= T38FAX_RATE_2400;
}
- if (parameters->rate_management == AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF) {
- p->t38.capability = p->t38.jointcapability |= T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF;
+ if (parameters->rate_management == AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF) {
+ p->t38.capability = p->t38.jointcapability |= T38FAX_RATE_MANAGEMENT_TRANSFERRED_TCF;
} else if (parameters->rate_management == AST_T38_RATE_MANAGEMENT_LOCAL_TCF) {
p->t38.capability = p->t38.jointcapability |= T38FAX_RATE_MANAGEMENT_LOCAL_TCF;
}
@@ -8289,7 +8289,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
if (!strcasecmp(s, "localTCF"))
peert38capability |= T38FAX_RATE_MANAGEMENT_LOCAL_TCF;
else if (!strcasecmp(s, "transferredTCF"))
- peert38capability |= T38FAX_RATE_MANAGEMENT_TRANSFERED_TCF;
+ peert38capability |= T38FAX_RATE_MANAGEMENT_TRANSFERRED_TCF;
} else if ((sscanf(a, "T38FaxUdpEC:%255s", s) == 1)) {
found = 1;
ast_debug(3, "UDP EC: %s\n", s);
diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h
index 0593f2281..10e302531 100644
--- a/include/asterisk/frame.h
+++ b/include/asterisk/frame.h
@@ -340,7 +340,7 @@ enum ast_control_t38_rate {
};
enum ast_control_t38_rate_management {
- AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF = 0,
+ AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF = 0,
AST_T38_RATE_MANAGEMENT_LOCAL_TCF,
};