comparison spandsp-0.0.3/spandsp-0.0.3/src/spandsp/t30.h @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
4:26cd8f1ef0b1 5:f762bf195c4b
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * t30.h - definitions for T.30 fax processing
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Copyright (C) 2003 Steve Underwood
9 *
10 * All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2, as
14 * published by the Free Software Foundation.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 *
25 * $Id: t30.h,v 1.61 2006/11/01 12:58:21 steveu Exp $
26 */
27
28 /*! \file */
29
30 #if !defined(_T30_H_)
31 #define _T30_H_
32
33 /*! \page t30_page T.30 FAX protocol handling
34
35 \section t30_page_sec_1 What does it do?
36 The T.30 protocol is the core protocol used for FAX transmission. This module
37 implements most of its key featrues. It does not interface to the outside work.
38 Seperate modules do that for T.38, analogue line, and other forms of FAX
39 communication.
40
41 Current features of this module include:
42
43 - FAXing to and from multi-page TIFF/F files, whose images are one of the standard
44 FAX sizes.
45 - T.4 1D (MH), T.4 2D,(MR) and T.6 (MMR) compression.
46 - Error correction (ECM)
47 - All standard resolutions and page sizes
48
49 \section t30_page_sec_2 How does it work?
50
51 Some of the following is paraphrased from some notes found a while ago on the Internet.
52 I cannot remember exactly where they came from, but they are useful.
53
54 The answer (CED) tone
55
56 The T.30 standard says an answering fax device must send CED (a 2100Hz tone) for
57 approximately 3 seconds before sending the first handshake message. Some machines
58 send an 1100Hz or 1850Hz tone, and some send no tone at all. In fact, this answer
59 tone is so unpredictable, it cannot really be used. It should, however, always be
60 generated according to the specification.
61
62 Common Timing Deviations
63
64 The T.30 spec. specifies a number of time-outs. For example, after dialing a number,
65 a calling fax system should listen for a response for 35 seconds before giving up.
66 These time-out periods are as follows:
67
68 * T1 - 35+-5s: the maximum time for which two fax system will attempt to identify each other
69 * T2 - 6+-1s: a time-out used to start the sequence for changing transmit parameters
70 * T3 - 10+-5s: a time-out used in handling operator interrupts
71 * T5 - 60+-5s: a time-out used in error correction mode
72
73 These time-outs are sometimes misinterpreted. In addition, they are routinely
74 ignored, sometimes with good reason. For example, after placing a call, the
75 calling fax system is supposed to wait for 35 seconds before giving up. If the
76 answering unit does not answer on the first ring or if a voice answering machine
77 is connected to the line, or if there are many delays through the network,
78 the delay before answer can be much longer than 35 seconds.
79
80 Fax units that support error correction mode (ECM) can respond to a post-image
81 handshake message with a receiver not ready (RNR) message. The calling unit then
82 queries the receiving fax unit with a receiver ready (RR) message. If the
83 answering unit is still busy (printing for example), it will repeat the RNR
84 message. According to the T.30 standard, this sequence (RR/RNR RR/RNR) can be
85 repeated for up to the end of T5 (60+-5s). However, many fax systems
86 ignore the time-out and will continue the sequence indefinitely, unless the user
87 manually overrides.
88
89 All the time-outs are subject to alteration, and sometimes misuse. Good T.30
90 implementations must do the right thing, and tolerate others doing the wrong thing.
91
92 Variations in the inter-carrier gap
93
94 T.30 specifies 75+-20ms of silence between signals using different modulation
95 schemes. Examples are between the end of a DCS signal and the start of a TCF signal,
96 and between the end of an image and the start of a post-image signal. Many fax systems
97 violate this requirement, especially for the silent period between DCS and TCF.
98 This may be stretched to well over 100ms. If this period is too long, it can interfere with
99 handshake signal error recovery, should a packet be corrupted on the line. Systems
100 should ensure they stay within the prescribed T.30 limits, and be tolerant of others
101 being out of spec..
102
103 Other timing variations
104
105 Testing is required to determine the ability of a fax system to handle
106 variations in the duration of pauses between unacknowledged handshake message
107 repetitions, and also in the pauses between the receipt of a handshake command and
108 the start of a response to that command. In order to reduce the total
109 transmission time, many fax systems start sending a response message before the
110 end of the command has been received.
111
112 Other deviations from the T.30 standard
113
114 There are many other commonly encountered variations between machines, including:
115
116 * frame sequence deviations
117 * preamble and flag sequence variations
118 * improper EOM usage
119 * unusual data rate fallback sequences
120 * common training pattern detection algorithms
121 * image transmission deviations
122 * use of the talker echo protect tone
123 * image padding and short lines
124 * RTP/RTN handshake message usage
125 * long duration lines
126 * nonstandard disconnect sequences
127 * DCN usage
128 */
129
130 #define T30_MAX_DIS_DTC_DCS_LEN 22
131 #define T30_MAX_IDENT_LEN 21
132
133 typedef struct t30_state_s t30_state_t;
134
135 /*!
136 T.30 phase B callback handler.
137 \brief T.30 phase B callback handler.
138 \param s The T.30 context.
139 \param user_data An opaque pointer.
140 \param result The phase B event code.
141 */
142 typedef void (t30_phase_b_handler_t)(t30_state_t *s, void *user_data, int result);
143
144 /*!
145 T.30 phase D callback handler.
146 \brief T.30 phase D callback handler.
147 \param s The T.30 context.
148 \param user_data An opaque pointer.
149 \param result The phase D event code.
150 */
151 typedef void (t30_phase_d_handler_t)(t30_state_t *s, void *user_data, int result);
152
153 /*!
154 T.30 phase E callback handler.
155 \brief T.30 phase E callback handler.
156 \param s The T.30 context.
157 \param user_data An opaque pointer.
158 \param completion_code The phase E completion code.
159 */
160 typedef void (t30_phase_e_handler_t)(t30_state_t *s, void *user_data, int completion_code);
161
162 /*!
163 T.30 document handler.
164 \brief T.30 document handler.
165 \param s The T.30 context.
166 \param user_data An opaque pointer.
167 \param result The document event code.
168 */
169 typedef int (t30_document_handler_t)(t30_state_t *s, void *user_data, int status);
170
171 /*!
172 T.30 set a receive or transmit type handler.
173 \brief T.30 set a receive or transmit type handler.
174 \param user_data An opaque pointer.
175 \param type The modem, tone or silence to be sent or received.
176 \param short_train TRUE if the short training sequence should be used (where one exists).
177 \param use_hdlc FALSE for bit stream, TRUE for HDLC framing.
178 */
179 typedef void (t30_set_handler_t)(void *user_data, int type, int short_train, int use_hdlc);
180
181 /*!
182 T.30 send HDLC handler.
183 \brief T.30 send HDLC handler.
184 \param user_data An opaque pointer.
185 \param msg The HDLC message.
186 \param len The length of the message.
187 */
188 typedef void (t30_send_hdlc_handler_t)(void *user_data, const uint8_t *msg, int len);
189
190 /*!
191 T.30 protocol completion codes, at phase E.
192 */
193 enum
194 {
195 T30_ERR_OK = 0, /* OK */
196
197 /* External problems */
198 T30_ERR_CEDTONE, /* The CED tone exceeded 5s */
199 T30_ERR_T0EXPIRED, /* Timed out waiting for initial communication */
200 T30_ERR_T1EXPIRED, /* Timed out waiting for the first message */
201 T30_ERR_T3EXPIRED, /* Timed out waiting for procedural interrupt */
202 T30_ERR_HDLCCARR, /* The HDLC carrier did not stop in a timely manner */
203 T30_ERR_CANNOTTRAIN, /* Failed to train with any of the compatible modems */
204 T30_ERR_OPERINTFAIL, /* Operator intervention failed */
205 T30_ERR_INCOMPATIBLE, /* Far end is not compatible */
206 T30_ERR_NOTRXCAPABLE, /* Far end is not receive capable */
207 T30_ERR_NOTTXCAPABLE, /* Far end is not transmit capable */
208 T30_ERR_UNEXPECTED, /* Unexpected message received */
209 T30_ERR_NORESSUPPORT, /* Far end cannot receive at the resolution of the image */
210 T30_ERR_NOSIZESUPPORT, /* Far end cannot receive at the size of image */
211
212 /* Internal problems */
213 T30_ERR_FILEERROR, /* TIFF/F file cannot be opened */
214 T30_ERR_NOPAGE, /* TIFF/F page not found */
215 T30_ERR_BADTIFF, /* TIFF/F format is not compatible */
216 T30_ERR_UNSUPPORTED, /* Unsupported feature */
217
218 /* Phase E status values returned to a transmitter */
219 T30_ERR_BADDCSTX, /* Received bad response to DCS or training */
220 T30_ERR_BADPGTX, /* Received a DCN from remote after sending a page */
221 T30_ERR_ECMPHDTX, /* Invalid ECM response received from receiver */
222 T30_ERR_ECMRNRTX, /* Timer T5 expired, receiver not ready */
223 T30_ERR_GOTDCNTX, /* Received a DCN while waiting for a DIS */
224 T30_ERR_INVALRSPTX, /* Invalid response after sending a page */
225 T30_ERR_NODISTX, /* Received other than DIS while waiting for DIS */
226 T30_ERR_NXTCMDTX, /* Timed out waiting for next send_page command from driver */
227 T30_ERR_PHBDEADTX, /* Received no response to DCS, training or TCF */
228 T30_ERR_PHDDEADTX, /* No response after sending a page */
229
230 /* Phase E status values returned to a receiver */
231 T30_ERR_ECMPHDRX, /* Invalid ECM response received from transmitter */
232 T30_ERR_GOTDCSRX, /* DCS received while waiting for DTC */
233 T30_ERR_INVALCMDRX, /* Unexpected command after page received */
234 T30_ERR_NOCARRIERRX, /* Carrier lost during fax receive */
235 T30_ERR_NOEOLRX, /* Timed out while waiting for EOL (end Of line) */
236 T30_ERR_NOFAXRX, /* Timed out while waiting for first line */
237 T30_ERR_NXTCMDRX, /* Timed out waiting for next receive page command */
238 T30_ERR_T2EXPDCNRX, /* Timer T2 expired while waiting for DCN */
239 T30_ERR_T2EXPDRX, /* Timer T2 expired while waiting for phase D */
240 T30_ERR_T2EXPFAXRX, /* Timer T2 expired while waiting for fax page */
241 T30_ERR_T2EXPMPSRX, /* Timer T2 expired while waiting for next fax page */
242 T30_ERR_T2EXPRRRX, /* Timer T2 expired while waiting for RR command */
243 T30_ERR_T2EXPRX, /* Timer T2 expired while waiting for NSS, DCS or MCF */
244 T30_ERR_DCNWHYRX, /* Unexpected DCN while waiting for DCS or DIS */
245 T30_ERR_DCNDATARX, /* Unexpected DCN while waiting for image data */
246 T30_ERR_DCNFAXRX, /* Unexpected DCN while waiting for EOM, EOP or MPS */
247 T30_ERR_DCNPHDRX, /* Unexpected DCN after EOM or MPS sequence */
248 T30_ERR_DCNRRDRX, /* Unexpected DCN after RR/RNR sequence */
249 T30_ERR_DCNNORTNRX, /* Unexpected DCN after requested retransmission */
250
251 T30_ERR_BADPAGE, /* TIFF/F page number tag missing */
252 T30_ERR_BADTAG, /* Incorrect values for TIFF/F tags */
253 T30_ERR_BADTIFFHDR, /* Bad TIFF/F header - incorrect values in fields */
254 T30_ERR_BADPARM, /* Invalid value for fax parameter */
255 T30_ERR_BADSTATE, /* Invalid initial state value specified */
256 T30_ERR_CMDDATA, /* Last command contained invalid data */
257 T30_ERR_DISCONNECT, /* Fax call disconnected by the other station */
258 T30_ERR_INVALARG, /* Illegal argument to function */
259 T30_ERR_INVALFUNC, /* Illegal call to function */
260 T30_ERR_NODATA, /* Data requested is not available (NSF, DIS, DCS) */
261 T30_ERR_NOMEM, /* Cannot allocate memory for more pages */
262 T30_ERR_NOPOLL, /* Poll not accepted */
263 T30_ERR_NOSTATE, /* Initial state value not set */
264 T30_ERR_RETRYDCN, /* Disconnected after permitted retries */
265 T30_ERR_CALLDROPPED /* The call dropped prematurely */
266 };
267
268 /*!
269 I/O modes for the T.30 protocol.
270 */
271 enum
272 {
273 T30_MODEM_NONE = 0,
274 T30_MODEM_PAUSE,
275 T30_MODEM_CED,
276 T30_MODEM_CNG,
277 T30_MODEM_V21,
278 T30_MODEM_V27TER_2400,
279 T30_MODEM_V27TER_4800,
280 T30_MODEM_V29_7200,
281 T30_MODEM_V29_9600,
282 T30_MODEM_V17_7200,
283 T30_MODEM_V17_9600,
284 T30_MODEM_V17_12000,
285 T30_MODEM_V17_14400,
286 T30_MODEM_DONE
287 };
288
289 enum
290 {
291 T30_SUPPORT_V27TER = 0x01,
292 T30_SUPPORT_V29 = 0x02,
293 T30_SUPPORT_V17 = 0x04,
294 T30_SUPPORT_V34 = 0x08,
295 T30_SUPPORT_IAF = 0x10,
296 };
297
298 enum
299 {
300 T30_SUPPORT_NO_COMPRESSION = 0x01,
301 T30_SUPPORT_T4_1D_COMPRESSION = 0x02,
302 T30_SUPPORT_T4_2D_COMPRESSION = 0x04,
303 T30_SUPPORT_T6_COMPRESSION = 0x08,
304 T30_SUPPORT_T85_COMPRESSION = 0x10, /* Monochrome JBIG */
305 T30_SUPPORT_T43_COMPRESSION = 0x20, /* Colour JBIG */
306 T30_SUPPORT_T45_COMPRESSION = 0x40 /* Run length colour compression */
307 };
308
309 enum
310 {
311 T30_SUPPORT_STANDARD_RESOLUTION = 0x01,
312 T30_SUPPORT_FINE_RESOLUTION = 0x02,
313 T30_SUPPORT_SUPERFINE_RESOLUTION = 0x04,
314
315 T30_SUPPORT_R4_RESOLUTION = 0x10000,
316 T30_SUPPORT_R8_RESOLUTION = 0x20000,
317 T30_SUPPORT_R16_RESOLUTION = 0x40000,
318
319 T30_SUPPORT_300_300_RESOLUTION = 0x100000,
320 T30_SUPPORT_400_400_RESOLUTION = 0x200000,
321 T30_SUPPORT_600_600_RESOLUTION = 0x400000,
322 T30_SUPPORT_1200_1200_RESOLUTION = 0x800000,
323 T30_SUPPORT_300_600_RESOLUTION = 0x1000000,
324 T30_SUPPORT_400_800_RESOLUTION = 0x2000000,
325 T30_SUPPORT_600_1200_RESOLUTION = 0x4000000
326 };
327
328 enum
329 {
330 T30_SUPPORT_215MM_WIDTH = 0x01,
331 T30_SUPPORT_255MM_WIDTH = 0x02,
332 T30_SUPPORT_303MM_WIDTH = 0x04,
333
334 T30_SUPPORT_UNLIMITED_LENGTH = 0x10000,
335 T30_SUPPORT_A4_LENGTH = 0x20000,
336 T30_SUPPORT_B4_LENGTH = 0x40000,
337 T30_SUPPORT_US_LETTER_LENGTH = 0x80000,
338 T30_SUPPORT_US_LEGAL_LENGTH = 0x100000
339 };
340
341 enum
342 {
343 T30_SUPPORT_SEP = 0x01,
344 T30_SUPPORT_PSA = 0x02
345 };
346
347 enum
348 {
349 T30_IAF_MODE_T37 = 0x01,
350 T30_IAF_MODE_T38 = 0x02,
351 T30_IAF_MODE_FLOW_CONTROL = 0x04,
352 /*! Continuous flow mode means data is sent as fast as possible, usually across
353 the Internet, where speed is not constrained by a PSTN modem. */
354 T30_IAF_MODE_CONTINUOUS_FLOW = 0x08,
355 /*! No TCF means TCF is not exchanged. The end points must sort out usable speed
356 issues locally. */
357 T30_IAF_MODE_NO_TCF = 0x10,
358 /*! No fill bits means do not insert fill bits, even if the T.30 messages request
359 them. */
360 T30_IAF_MODE_NO_FILL_BITS = 0x20
361 };
362
363 /*!
364 T.30 FAX channel descriptor. This defines the state of a single working
365 instance of a T.30 FAX channel.
366 */
367 struct t30_state_s
368 {
369 /* This must be kept the first thing in the structure, so it can be pointed
370 to reliably as the structures change over time. */
371 t4_state_t t4;
372
373 /*! \brief TRUE is behaving as the calling party */
374 int calling_party;
375
376 /*! \brief The local identifier string. */
377 char local_ident[T30_MAX_IDENT_LEN];
378 /*! \brief The identifier string supplied by the remote FAX machine. */
379 char far_ident[T30_MAX_IDENT_LEN];
380 /*! \brief The sub-address string to be sent to the remote FAX machine. */
381 char local_sub_address[T30_MAX_IDENT_LEN];
382 /*! \brief The sub-address string supplied by the remote FAX machine. */
383 char far_sub_address[T30_MAX_IDENT_LEN];
384 /*! \brief The selective polling sub-address supplied by the remote FAX machine. */
385 char sep_address[T30_MAX_IDENT_LEN];
386 /*! \brief The polled sub-address supplied by the remote FAX machine. */
387 char psa_address[T30_MAX_IDENT_LEN];
388 /*! \brief A password to be associated with the T.30 context. */
389 char local_password[T30_MAX_IDENT_LEN];
390 /*! \brief A password expected from the far end. */
391 char far_password[T30_MAX_IDENT_LEN];
392 /*! \brief The text which will be used in FAX page header. No text results
393 in no header line. */
394 char header_info[50 + 1];
395 /*! \brief The country of origin of the remote machine, if known, else NULL. */
396 const char *country;
397 /*! \brief The vendor of the remote machine, if known, else NULL. */
398 const char *vendor;
399 /*! \brief The model of the remote machine, if known, else NULL. */
400 const char *model;
401 uint8_t local_nsf[100];
402 int local_nsf_len;
403
404 /*! \brief A pointer to a callback routine to be called when phase B events
405 occur. */
406 t30_phase_b_handler_t *phase_b_handler;
407 /*! \brief An opaque pointer supplied in event B callbacks. */
408 void *phase_b_user_data;
409 /*! \brief A pointer to a callback routine to be called when phase D events
410 occur. */
411 t30_phase_d_handler_t *phase_d_handler;
412 /*! \brief An opaque pointer supplied in event D callbacks. */
413 void *phase_d_user_data;
414 /*! \brief A pointer to a callback routine to be called when phase E events
415 occur. */
416 t30_phase_e_handler_t *phase_e_handler;
417 /*! \brief An opaque pointer supplied in event E callbacks. */
418 void *phase_e_user_data;
419
420 /*! \brief A pointer to a callback routine to be called when document events
421 (e.g. end of transmitted document) occur. */
422 t30_document_handler_t *document_handler;
423 /*! \brief An opaque pointer supplied in document callbacks. */
424 void *document_user_data;
425
426 t30_set_handler_t *set_rx_type_handler;
427 void *set_rx_type_user_data;
428 t30_set_handler_t *set_tx_type_handler;
429 void *set_tx_type_user_data;
430
431 t30_send_hdlc_handler_t *send_hdlc_handler;
432 void *send_hdlc_user_data;
433
434 int phase;
435 int next_phase;
436 int state;
437 int step;
438
439 uint8_t dcs_frame[T30_MAX_DIS_DTC_DCS_LEN];
440 int dcs_len;
441 uint8_t dis_dtc_frame[T30_MAX_DIS_DTC_DCS_LEN];
442 int dis_dtc_len;
443 /*! \brief TRUE if a valid DIS has been received from the far end. */
444 int dis_received;
445 /*! \brief TRUE if a valid passwrod has been received from the far end. */
446 int far_password_ok;
447
448 /*! \brief A flag to indicate a message is in progress. */
449 int in_message;
450
451 /*! \brief TRUE if the short training sequence should be used. */
452 int short_train;
453
454 /*! \brief A count of the number of bits in the trainability test. */
455 int training_test_bits;
456 int training_current_zeros;
457 int training_most_zeros;
458
459 /*! \brief The current fallback step for the fast message transfer modem. */
460 int current_fallback;
461 /*! \brief TRUE if a carrier is present. Otherwise FALSE. */
462 int rx_signal_present;
463 /*! \brief TRUE if a modem has trained correctly. */
464 int rx_trained;
465 int current_rx_type;
466 int current_tx_type;
467
468 /*! \brief T0 is the answer timeout when calling another FAX machine.
469 Placing calls is handled outside the FAX processing, but this timeout keeps
470 running until V.21 modulation is sent or received.
471 T1 is the remote terminal identification timeout (in audio samples). */
472 int timer_t0_t1;
473 /*! \brief T2 is the HDLC command timeout.
474 T4 is the HDLC response timeout (in audio samples). */
475 int timer_t2_t4;
476 /*! \brief TRUE if the T2/T4 timer is actually timing T4 */
477 int timer_is_t4;
478 /*! \brief Procedural interrupt timeout (in audio samples). */
479 int timer_t3;
480 /*! \brief This is only used in error correcting mode. */
481 int timer_t5;
482 /*! \brief This is only used in full duplex (e.g. ISDN) modes. */
483 int timer_t6;
484 /*! \brief This is only used in full duplex (e.g. ISDN) modes. */
485 int timer_t7;
486 /*! \brief This is only used in full duplex (e.g. ISDN) modes. */
487 int timer_t8;
488
489 int far_end_detected;
490
491 int local_interrupt_pending;
492 int crp_enabled;
493 int line_encoding;
494 int min_row_bits;
495 int x_resolution;
496 int y_resolution;
497 int image_width;
498 int retries;
499 int error_correcting_mode;
500 int ppr_count;
501 int octets_per_ecm_frame;
502 uint8_t ecm_data[256][260];
503 int16_t ecm_len[256];
504 uint8_t ecm_frame_map[3 + 32];
505 int ecm_page;
506 int ecm_block;
507 int ecm_frames;
508 int ecm_current_frame;
509 int ecm_at_page_end;
510 int next_tx_step;
511 int next_rx_step;
512 char rx_file[256];
513 int rx_stop_page;
514 char tx_file[256];
515 int tx_start_page;
516 int tx_stop_page;
517 int current_status;
518 int iaf;
519 int supported_modems;
520 int supported_compressions;
521 int supported_resolutions;
522 int supported_image_sizes;
523 int supported_polling_features;
524 int ecm_allowed;
525 /*! \brief Error and flow logging control */
526 logging_state_t logging;
527 };
528
529 typedef struct
530 {
531 /*! \brief The current bit rate for image transfer. */
532 int bit_rate;
533 /*! \brief TRUE if error correcting mode is used. */
534 int error_correcting_mode;
535 /*! \brief The number of pages transferred so far. */
536 int pages_transferred;
537 /*! \brief The number of horizontal pixels in the most recent page. */
538 int width;
539 /*! \brief The number of vertical pixels in the most recent page. */
540 int length;
541 /*! \brief The number of bad pixel rows in the most recent page. */
542 int bad_rows;
543 /*! \brief The largest number of bad pixel rows in a block in the most recent page. */
544 int longest_bad_row_run;
545 /*! \brief The horizontal column-to-column resolution of the page in pixels per metre */
546 int x_resolution;
547 /*! \brief The vertical row-to-row resolution of the page in pixels per metre */
548 int y_resolution;
549 /*! \brief The type of compression used between the FAX machines */
550 int encoding;
551 /*! \brief The size of the image, in bytes */
552 int image_size;
553 /*! \brief Current status */
554 int current_status;
555 } t30_stats_t;
556
557 #ifdef __cplusplus
558 extern "C" {
559 #endif
560
561 /*! Initialise a T.30 context.
562 \brief Initialise a T.30 context.
563 \param s The T.30 context.
564 \param calling_party TRUE if the context is for a calling party. FALSE if the
565 context is for an answering party.
566 \return 0 for OK, else -1. */
567 int t30_init(t30_state_t *s,
568 int calling_party,
569 t30_set_handler_t *set_rx_type_handler,
570 void *set_rx_type_user_data,
571 t30_set_handler_t *set_tx_type_handler,
572 void *set_tx_type_user_data,
573 t30_send_hdlc_handler_t *send_hdlc_handler,
574 void *send_hdlc_user_data);
575
576 /*! Release a T.30 context.
577 \brief Release a T.30 context.
578 \param s The T.30 context. */
579 void t30_release(t30_state_t *s);
580
581 /*! Restart a T.30 context.
582 \brief Restart a T.30 context.
583 \param s The T.30 context.
584 \return 0 for OK, else -1. */
585 int t30_restart(t30_state_t *s);
586
587 /*! Create and initialise a T.30 context.
588 \brief Create and initialise a T.30 context.
589 \param calling_party TRUE if the context is for a calling party. FALSE if the
590 context is for an answering party.
591 \return A pointer to the FAX context, or NULL if one could not be created.
592 */
593 t30_state_t *t30_create(int calling_party,
594 t30_set_handler_t *set_rx_type_handler,
595 void *set_rx_type_user_data,
596 t30_set_handler_t *set_tx_type_handler,
597 void *set_tx_type_user_data,
598 t30_send_hdlc_handler_t *send_hdlc_handler,
599 void *send_hdlc_user_data);
600
601 /*! Free a T.30 context.
602 \brief Free a T.30 context.
603 \param s The T.30 context. */
604 void t30_free(t30_state_t *s);
605
606 /*! Cleanup a T.30 context if the call terminates.
607 \brief Cleanup a T.30 context if the call terminates.
608 \param s The T.30 context. */
609 void t30_terminate(t30_state_t *s);
610
611 /*! Return a text name for a T.30 frame type.
612 \brief Return a text name for a T.30 frame type.
613 \param x The frametype octet.
614 \return A pointer to the text name for the frame type. If the frame type is
615 not value, the string "???" is returned. */
616 const char *t30_frametype(uint8_t x);
617
618 /*! Decode a DIS, DTC or DCS frame, and log the contents.
619 \brief Decode a DIS, DTC or DCS frame, and log the contents.
620 \param s The T.30 context.
621 \param dis A pointer to the frame to be decoded.
622 \param len The length of the frame. */
623 void t30_decode_dis_dtc_dcs(t30_state_t *s, const uint8_t *dis, int len);
624
625 /*! Convert a phase E completion code to a short text description.
626 \brief Convert a phase E completion code to a short text description.
627 \param result The result code.
628 \return A pointer to the description. */
629 const char *t30_completion_code_to_str(int result);
630
631 /*! Set Internet aware FAX (IAF) mode.
632 \brief Set Internet aware FAX (IAF) mode.
633 \param s The T.30 context.
634 \param iaf TRUE for IAF, or FALSE for non-IAF. */
635 void t30_set_iaf_mode(t30_state_t *s, int iaf);
636
637 /*! Set the sub-address associated with a T.30 context.
638 \brief Set the sub-address associated with a T.30 context.
639 \param s The T.30 context.
640 \param sub_address A pointer to the sub-address.
641 \return 0 for OK, else -1. */
642 int t30_set_local_sub_address(t30_state_t *s, const char *sub_address);
643
644 /*! Set the header information associated with a T.30 context.
645 \brief Set the header information associated with a T.30 context.
646 \param s The T.30 context.
647 \param info A pointer to the information string.
648 \return 0 for OK, else -1. */
649 int t30_set_header_info(t30_state_t *s, const char *info);
650
651 /*! Set the local identifier associated with a T.30 context.
652 \brief Set the local identifier associated with a T.30 context.
653 \param s The T.30 context.
654 \param id A pointer to the identifier.
655 \return 0 for OK, else -1. */
656 int t30_set_local_ident(t30_state_t *s, const char *id);
657
658 int t30_set_local_nsf(t30_state_t *s, const uint8_t *nsf, int len);
659
660 /*! Get the sub-address associated with a T.30 context.
661 \brief Get the sub-address associated with a T.30 context.
662 \param s The T.30 context.
663 \param sub_address A pointer to a buffer for the sub-address. The buffer
664 should be at least 21 bytes long.
665 \return the length of the string. */
666 size_t t30_get_sub_address(t30_state_t *s, char *sub_address);
667
668 /*! Get the header information associated with a T.30 context.
669 \brief Get the header information associated with a T.30 context.
670 \param s The T.30 context.
671 \param sub_address A pointer to a buffer for the header information. The buffer
672 should be at least 51 bytes long.
673 \return the length of the string. */
674 size_t t30_get_header_info(t30_state_t *s, char *info);
675
676 /*! Get the local FAX machine identifier associated with a T.30 context.
677 \brief Get the local identifier associated with a T.30 context.
678 \param s The T.30 context.
679 \param id A pointer to a buffer for the identifier. The buffer should
680 be at least 21 bytes long.
681 \return the length of the string. */
682 size_t t30_get_local_ident(t30_state_t *s, char *id);
683
684 /*! Get the remote FAX machine identifier associated with a T.30 context.
685 \brief Get the remote identifier associated with a T.30 context.
686 \param s The T.30 context.
687 \param id A pointer to a buffer for the identifier. The buffer should
688 be at least 21 bytes long.
689 \return the length of the string. */
690 size_t t30_get_far_ident(t30_state_t *s, char *id);
691
692 /*! Get the country of origin of the remote FAX machine associated with a T.30 context.
693 \brief Get the country of origin of the remote FAX machine associated with a T.30 context.
694 \param s The T.30 context.
695 \return a pointer to the country name, or NULL if the country is not known. */
696 const char *t30_get_far_country(t30_state_t *s);
697
698 /*! Get the name of the vendor of the remote FAX machine associated with a T.30 context.
699 \brief Get the name of the vendor of the remote FAX machine associated with a T.30 context.
700 \param s The T.30 context.
701 \return a pointer to the vendor name, or NULL if the vendor is not known. */
702 const char *t30_get_far_vendor(t30_state_t *s);
703
704 /*! Get the name of the model of the remote FAX machine associated with a T.30 context.
705 \brief Get the name of the model of the remote FAX machine associated with a T.30 context.
706 \param s The T.30 context.
707 \return a pointer to the model name, or NULL if the model is not known. */
708 const char *t30_get_far_model(t30_state_t *s);
709
710 /*! Get the current transfer statistics for the file being sent or received.
711 \brief Get the current transfer statistics.
712 \param s The T.30 context.
713 \param t A pointer to a buffer for the statistics. */
714 void t30_get_transfer_statistics(t30_state_t *s, t30_stats_t *t);
715
716 /*! Set a callback function for T.30 phase B handling.
717 \brief Set a callback function for T.30 phase B handling.
718 \param s The T.30 context.
719 \param handler The callback function
720 \param user_data An opaque pointer passed to the callback function. */
721 void t30_set_phase_b_handler(t30_state_t *s, t30_phase_b_handler_t *handler, void *user_data);
722
723 /*! Set a callback function for T.30 phase D handling.
724 \brief Set a callback function for T.30 phase D handling.
725 \param s The T.30 context.
726 \param handler The callback function
727 \param user_data An opaque pointer passed to the callback function. */
728 void t30_set_phase_d_handler(t30_state_t *s, t30_phase_d_handler_t *handler, void *user_data);
729
730 /*! Set a callback function for T.30 phase E handling.
731 \brief Set a callback function for T.30 phase E handling.
732 \param s The T.30 context.
733 \param handler The callback function
734 \param user_data An opaque pointer passed to the callback function. */
735 void t30_set_phase_e_handler(t30_state_t *s, t30_phase_e_handler_t *handler, void *user_data);
736
737 /*! Set a callback function for T.30 end of document handling.
738 \brief Set a callback function for T.30 end of document handling.
739 \param s The T.30 context.
740 \param handler The callback function
741 \param user_data An opaque pointer passed to the callback function. */
742 void t30_set_document_handler(t30_state_t *s, t30_document_handler_t *handler, void *user_data);
743
744 /*! Specify the file name of the next TIFF file to be received by a T.30
745 context.
746 \brief Set next receive file name.
747 \param s The T.30 context.
748 \param file The file name
749 \param stop_page The maximum page to receive. -1 for no restriction. */
750 void t30_set_rx_file(t30_state_t *s, const char *file, int stop_page);
751
752 /*! Specify the file name of the next TIFF file to be transmitted by a T.30
753 context.
754 \brief Set next transmit file name.
755 \param s The T.30 context.
756 \param file The file name
757 \param start_page The first page to send. -1 for no restriction.
758 \param stop_page The last page to send. -1 for no restriction. */
759 void t30_set_tx_file(t30_state_t *s, const char *file, int start_page, int stop_page);
760
761 /*! Specify which modem types are supported by a T.30 context.
762 \brief Specify supported modems.
763 \param s The T.30 context.
764 \param supported_modems Bit field list of the supported modems. */
765 void t30_set_supported_modems(t30_state_t *s, int supported_modems);
766
767 /*! Specify which compression types are supported by a T.30 context.
768 \brief Specify supported compression types.
769 \param s The T.30 context.
770 \param supported_compressions Bit field list of the supported compression types. */
771 void t30_set_supported_compressions(t30_state_t *s, int supported_compressions);
772
773 /*! Specify which resolutions are supported by a T.30 context.
774 \brief Specify supported resolutions.
775 \param s The T.30 context.
776 \param supported_compressions Bit field list of the supported resolutions. */
777 void t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions);
778
779 /*! Specify which images sizes are supported by a T.30 context.
780 \brief Specify supported image sizes.
781 \param s The T.30 context.
782 \param supported_image_sizes Bit field list of the supported widths and lengths. */
783 void t30_set_supported_image_sizes(t30_state_t *s, int supported_image_sizes);
784
785 /*! Specify if error correction mode (ECM) is allowed by a T.30 context.
786 \brief Select ECM capability.
787 \param s The T.30 context.
788 \param enabled TRUE for ECM capable, FALSE for not ECM capable. */
789 void t30_set_ecm_capability(t30_state_t *s, int enabled);
790
791 /*! Request a local interrupt of FAX exchange.
792 \brief Request a local interrupt of FAX exchange.
793 \param s The T.30 context.
794 \param state TRUE to enable interrupt request, else FALSE. */
795 void t30_local_interrupt_request(t30_state_t *s, int state);
796
797 /*! Inform the T.30 engine the current transmission has completed.
798 \brief Inform the T.30 engine the current transmission has completed.
799 \param s The T.30 context. */
800 void t30_send_complete(void *user_data);
801
802 /*! Inform the T.30 engine the current receive has completed. This is
803 only needed to report an unexpected end of the receive operation, as
804 might happen with T.38 dying.
805 \brief Inform the T.30 engine the current receive has completed.
806 \param s The T.30 context. */
807 void t30_receive_complete(void *user_data);
808
809 /*! Get a bit of received non-ECM image data.
810 \brief Get a bit of received non-ECM image data.
811 \param user_data An opaque pointer, which must point to the T.30 context.
812 \return bit The next bit to transmit. */
813 int t30_non_ecm_get_bit(void *user_data);
814
815 /*! Process a bit of received non-ECM image data.
816 \brief Process a bit of received non-ECM image data
817 \param user_data An opaque pointer, which must point to the T.30 context.
818 \param bit The received bit. */
819 void t30_non_ecm_put_bit(void *user_data, int bit);
820
821 /*! Process a byte of received non-ECM image data.
822 \brief Process a byte of received non-ECM image data
823 \param user_data An opaque pointer, which must point to the T.30 context.
824 \param byte The received byte. */
825 void t30_non_ecm_putbyte(void *user_data, int byte);
826
827 /*! Process a received HDLC frame.
828 \brief Process a received HDLC frame.
829 \param s The T.30 context.
830 \param ok TRUE if the frame was received without error.
831 \param msg The HDLC message.
832 \param int The length of the message, in octets. */
833 void t30_hdlc_accept(void *user_data, int ok, const uint8_t *msg, int len);
834
835 /*! Report the passage of time to the T.30 engine.
836 \brief Report the passage of time to the T.30 engine.
837 \param s The T.30 context.
838 \param samples The time change in 1/8000th second steps. */
839 void t30_timer_update(t30_state_t *s, int samples);
840
841 #ifdef __cplusplus
842 }
843 #endif
844
845 #endif
846 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.