aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-26 19:31:36 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-26 19:31:36 +0000
commit268988c40ff81235fc35491d3c6cd787d676d8df (patch)
tree1a3b60176c21498bdf19dad111b6a2af9a395c9e /apps
parentebff1e2bfab6fdc0765d0eaae5a578febfd52b44 (diff)
Merged revisions 203699 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r203699 | file | 2009-06-26 16:27:24 -0300 (Fri, 26 Jun 2009) | 2 lines Improve T.38 negotiation by exchanging session parameters between application and channel. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@203703 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_fax.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/apps/app_fax.c b/apps/app_fax.c
index e38ac4e5c..00811211b 100644
--- a/apps/app_fax.c
+++ b/apps/app_fax.c
@@ -116,7 +116,7 @@ typedef struct {
int direction; /* Fax direction: 0 - receiving, 1 - sending */
int caller_mode;
char *file_name;
-
+ struct ast_control_t38_parameters t38parameters;
volatile int finished;
} fax_session;
@@ -327,7 +327,6 @@ static int transmit_audio(fax_session *s)
struct ast_frame *fr;
int last_state = 0;
struct timeval now, start, state_change;
- enum ast_control_t38 t38control;
#if SPANDSP_RELEASE_DATE >= 20080725
/* for spandsp shaphots 0.0.6 and higher */
@@ -411,9 +410,16 @@ static int transmit_audio(fax_session *s)
/* Do not pass channel to ast_dsp_process otherwise it may queue modified audio frame back */
fr = ast_dsp_process(NULL, dsp, fr);
if (fr && fr->frametype == AST_FRAME_DTMF && fr->subclass == 'f') {
+ struct ast_control_t38_parameters parameters = { .request_response = AST_T38_REQUEST_NEGOTIATE,
+ .version = 0,
+ .max_datagram = 400,
+ .rate = AST_T38_RATE_9600,
+ .rate_management = AST_T38_RATE_MANAGEMENT_TRANSFERED_TCF,
+ .fill_bit_removal = 1,
+ .transcoding_mmr = 1,
+ };
ast_debug(1, "Fax tone detected. Requesting T38\n");
- t38control = AST_T38_REQUEST_NEGOTIATE;
- ast_indicate_data(s->chan, AST_CONTROL_T38, &t38control, sizeof(t38control));
+ ast_indicate_data(s->chan, AST_CONTROL_T38_PARAMETERS, &parameters, sizeof(parameters));
detect_tone = 0;
}
@@ -438,11 +444,11 @@ static int transmit_audio(fax_session *s)
state_change = ast_tvnow();
last_state = t30state->state;
}
- } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 &&
- inf->datalen == sizeof(enum ast_control_t38)) {
- t38control =*((enum ast_control_t38 *) inf->data.ptr);
- if (t38control == AST_T38_NEGOTIATED) {
+ } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38_PARAMETERS) {
+ struct ast_control_t38_parameters *parameters = inf->data.ptr;
+ if (parameters->request_response == AST_T38_NEGOTIATED) {
/* T38 switchover completed */
+ s->t38parameters = *parameters;
ast_debug(1, "T38 negotiated, finishing audio loop\n");
res = 1;
break;
@@ -503,8 +509,6 @@ static int transmit_t38(fax_session *s)
struct ast_frame *inf = NULL;
int last_state = 0;
struct timeval now, start, state_change, last_frame;
- enum ast_control_t38 t38control;
-
t30_state_t *t30state;
t38_core_state_t *t38state;
@@ -525,6 +529,17 @@ static int transmit_t38(fax_session *s)
return -1;
}
+ t38_set_max_datagram_size(t38state, s->t38parameters.max_datagram);
+
+ if (s->t38parameters.fill_bit_removal) {
+ t38_set_fill_bit_removal(t38state, TRUE);
+ }
+ if (s->t38parameters.transcoding_mmr) {
+ t38_set_mmr_transcoding(t38state, TRUE);
+ } else if (s->t38parameters.transcoding_jbig) {
+ t38_set_jbig_transcoding(t38state, TRUE);
+ }
+
/* Setup logging */
set_logging(&t38.logging);
set_logging(&t30state->logging);
@@ -568,12 +583,9 @@ static int transmit_t38(fax_session *s)
state_change = ast_tvnow();
last_state = t30state->state;
}
- } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38 &&
- inf->datalen == sizeof(enum ast_control_t38)) {
-
- t38control = *((enum ast_control_t38 *) inf->data.ptr);
-
- if (t38control == AST_T38_TERMINATED || t38control == AST_T38_REFUSED) {
+ } else if (inf->frametype == AST_FRAME_CONTROL && inf->subclass == AST_CONTROL_T38_PARAMETERS) {
+ struct ast_control_t38_parameters *parameters = inf->data.ptr;
+ if (parameters->request_response == AST_T38_TERMINATED || parameters->request_response == AST_T38_REFUSED) {
ast_debug(1, "T38 down, terminating\n");
res = -1;
break;
@@ -664,7 +676,7 @@ static int sndfax_exec(struct ast_channel *chan, void *data)
{
int res = 0;
char *parse;
- fax_session session;
+ fax_session session = { 0, };
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(file_name);