comparison spandsp-0.0.6pre17/src/spandsp/t30.h @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
comparison
equal deleted inserted replaced
3:c6c5a16ce2f2 4:26cd8f1ef0b1
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 Lesser General Public License version 2.1,
14 * as 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 Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License 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.126.4.1 2009/12/19 09:47:56 steveu Exp $
26 */
27
28 /*! \file */
29
30 #if !defined(_SPANDSP_T30_H_)
31 #define _SPANDSP_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 - V.27ter, V.29 and V.17 modes (2400bps, to 14,400bps).
46 - T.4 1D (MH), T.4 2D,(MR) and T.6 (MMR) compression.
47 - Error correction mode (ECM).
48 - All standard horizonal resolutions (R8, R16, 300dpi, 600dpi, 800dpi, 1200dpi).
49 - All standard vertical resolutions (standard, fine, superfine, 300dpi, 600dpi, 800dpi, 1200dpi).
50 - All standard page widths (A4, B4, A3).
51 - All standard page lengths (A4, B4, North American letter, North American legal, continuous).
52 - Monitoring and sending identifier strings (CSI, TSI, and CIG).
53 - Monitoring and sending sub-address strings (SUB).
54 - Monitoring and sending polling sub-addresses (SEP).
55 - Monitoring and sending polled sub-addresses (PSA).
56 - Monitoring and sending sender identifications (SID).
57 - Monitoring and sending passwords (PWD).
58 - Monitoring of non-standard facility frames (NSF, NSC, and NSS).
59 - Sending custom non-standard facility frames (NSF, NSC, and NSS).
60 - Analogue modem and T.38 operation.
61
62 \section t30_page_sec_2 How does it work?
63
64 Some of the following is paraphrased from some notes found a while ago on the Internet.
65 I cannot remember exactly where they came from, but they are useful.
66
67 \subsection t30_page_sec_2a The answer (CED) tone
68
69 The T.30 standard says an answering fax device must send CED (a 2100Hz tone) for
70 approximately 3 seconds before sending the first handshake message. Some machines
71 send an 1100Hz or 1850Hz tone, and some send no tone at all. In fact, this answer
72 tone is so unpredictable, it cannot really be used. It should, however, always be
73 generated according to the specification.
74
75 \subsection t30_page_sec_2b Common Timing Deviations
76
77 The T.30 spec. specifies a number of time-outs. For example, after dialing a number,
78 a calling fax system should listen for a response for 35 seconds before giving up.
79 These time-out periods are as follows:
80
81 - T1 - 35+-5s: the maximum time for which two fax system will attempt to identify each other
82 - T2 - 6+-1s: a time-out used to start the sequence for changing transmit parameters
83 - T3 - 10+-5s: a time-out used in handling operator interrupts
84 - T5 - 60+-5s: a time-out used in error correction mode
85
86 These time-outs are sometimes misinterpreted. In addition, they are routinely
87 ignored, sometimes with good reason. For example, after placing a call, the
88 calling fax system is supposed to wait for 35 seconds before giving up. If the
89 answering unit does not answer on the first ring or if a voice answering machine
90 is connected to the line, or if there are many delays through the network,
91 the delay before answer can be much longer than 35 seconds.
92
93 Fax units that support error correction mode (ECM) can respond to a post-image
94 handshake message with a receiver not ready (RNR) message. The calling unit then
95 queries the receiving fax unit with a receiver ready (RR) message. If the
96 answering unit is still busy (printing for example), it will repeat the RNR
97 message. According to the T.30 standard, this sequence (RR/RNR RR/RNR) can be
98 repeated for up to the end of T5 (60+-5s). However, many fax systems
99 ignore the time-out and will continue the sequence indefinitely, unless the user
100 manually overrides.
101
102 All the time-outs are subject to alteration, and sometimes misuse. Good T.30
103 implementations must do the right thing, and tolerate others doing the wrong thing.
104
105 \subsection t30_page_sec_2c Variations in the inter-carrier gap
106
107 T.30 specifies 75+-20ms of silence between signals using different modulation
108 schemes. Examples are between the end of a DCS signal and the start of a TCF signal,
109 and between the end of an image and the start of a post-image signal. Many fax systems
110 violate this requirement, especially for the silent period between DCS and TCF.
111 This may be stretched to well over 100ms. If this period is too long, it can interfere with
112 handshake signal error recovery, should a packet be corrupted on the line. Systems
113 should ensure they stay within the prescribed T.30 limits, and be tolerant of others
114 being out of spec..
115
116 \subsection t30_page_sec_2d Other timing variations
117
118 Testing is required to determine the ability of a fax system to handle
119 variations in the duration of pauses between unacknowledged handshake message
120 repetitions, and also in the pauses between the receipt of a handshake command and
121 the start of a response to that command. In order to reduce the total
122 transmission time, many fax systems start sending a response message before the
123 end of the command has been received.
124
125 \subsection t30_page_sec_2e Other deviations from the T.30 standard
126
127 There are many other commonly encountered variations between machines, including:
128
129 - frame sequence deviations
130 - preamble and flag sequence variations
131 - improper EOM usage
132 - unusual data rate fallback sequences
133 - common training pattern detection algorithms
134 - image transmission deviations
135 - use of the talker echo protect tone
136 - image padding and short lines
137 - RTP/RTN handshake message usage
138 - long duration lines
139 - nonstandard disconnect sequences
140 - DCN usage
141 */
142
143 /*! The maximum length of a DIS, DTC or DCS frame */
144 #define T30_MAX_DIS_DTC_DCS_LEN 22
145 /*! The maximum length of the body of an ident string */
146 #define T30_MAX_IDENT_LEN 20
147 /*! The maximum length of the user string to insert in page headers */
148 #define T30_MAX_PAGE_HEADER_INFO 50
149
150 typedef struct t30_state_s t30_state_t;
151
152 /*!
153 T.30 phase B callback handler. This handler can be used to process addition
154 information available in some FAX calls, such as passwords. The callback handler
155 can access whatever additional information might have been received, using
156 t30_get_received_info().
157 \brief T.30 phase B callback handler.
158 \param s The T.30 context.
159 \param user_data An opaque pointer.
160 \param result The phase B event code.
161 \return The new status. Normally, T30_ERR_OK is returned.
162 */
163 typedef int (t30_phase_b_handler_t)(t30_state_t *s, void *user_data, int result);
164
165 /*!
166 T.30 phase D callback handler.
167 \brief T.30 phase D callback handler.
168 \param s The T.30 context.
169 \param user_data An opaque pointer.
170 \param result The phase D event code.
171 \return The new status. Normally, T30_ERR_OK is returned.
172 */
173 typedef int (t30_phase_d_handler_t)(t30_state_t *s, void *user_data, int result);
174
175 /*!
176 T.30 phase E callback handler.
177 \brief T.30 phase E callback handler.
178 \param s The T.30 context.
179 \param user_data An opaque pointer.
180 \param completion_code The phase E completion code.
181 */
182 typedef void (t30_phase_e_handler_t)(t30_state_t *s, void *user_data, int completion_code);
183
184 /*!
185 T.30 real time frame handler.
186 \brief T.30 real time frame handler.
187 \param s The T.30 context.
188 \param user_data An opaque pointer.
189 \param direction TRUE for incoming, FALSE for outgoing.
190 \param msg The HDLC message.
191 \param len The length of the message.
192 */
193 typedef void (t30_real_time_frame_handler_t)(t30_state_t *s,
194 void *user_data,
195 int direction,
196 const uint8_t msg[],
197 int len);
198
199 /*!
200 T.30 document handler.
201 \brief T.30 document handler.
202 \param s The T.30 context.
203 \param user_data An opaque pointer.
204 \param result The document event code.
205 */
206 typedef int (t30_document_handler_t)(t30_state_t *s, void *user_data, int status);
207
208 /*!
209 T.30 set a receive or transmit type handler.
210 \brief T.30 set a receive or transmit type handler.
211 \param user_data An opaque pointer.
212 \param type The modem, tone or silence to be sent or received.
213 \param bit_rate The bit rate of the modem to be sent or received.
214 \param short_train TRUE if the short training sequence should be used (where one exists).
215 \param use_hdlc FALSE for bit stream, TRUE for HDLC framing.
216 */
217 typedef void (t30_set_handler_t)(void *user_data, int type, int bit_rate, int short_train, int use_hdlc);
218
219 /*!
220 T.30 send HDLC handler.
221 \brief T.30 send HDLC handler.
222 \param user_data An opaque pointer.
223 \param msg The HDLC message.
224 \param len The length of the message.
225 */
226 typedef void (t30_send_hdlc_handler_t)(void *user_data, const uint8_t msg[], int len);
227
228 /*!
229 T.30 protocol completion codes, at phase E.
230 */
231 enum
232 {
233 T30_ERR_OK = 0, /*! OK */
234
235 /* Link problems */
236 T30_ERR_CEDTONE, /*! The CED tone exceeded 5s */
237 T30_ERR_T0_EXPIRED, /*! Timed out waiting for initial communication */
238 T30_ERR_T1_EXPIRED, /*! Timed out waiting for the first message */
239 T30_ERR_T3_EXPIRED, /*! Timed out waiting for procedural interrupt */
240 T30_ERR_HDLC_CARRIER, /*! The HDLC carrier did not stop in a timely manner */
241 T30_ERR_CANNOT_TRAIN, /*! Failed to train with any of the compatible modems */
242 T30_ERR_OPER_INT_FAIL, /*! Operator intervention failed */
243 T30_ERR_INCOMPATIBLE, /*! Far end is not compatible */
244 T30_ERR_RX_INCAPABLE, /*! Far end is not able to receive */
245 T30_ERR_TX_INCAPABLE, /*! Far end is not able to transmit */
246 T30_ERR_NORESSUPPORT, /*! Far end cannot receive at the resolution of the image */
247 T30_ERR_NOSIZESUPPORT, /*! Far end cannot receive at the size of image */
248 T30_ERR_UNEXPECTED, /*! Unexpected message received */
249
250 /* Phase E status values returned to a transmitter */
251 T30_ERR_TX_BADDCS, /*! Received bad response to DCS or training */
252 T30_ERR_TX_BADPG, /*! Received a DCN from remote after sending a page */
253 T30_ERR_TX_ECMPHD, /*! Invalid ECM response received from receiver */
254 T30_ERR_TX_GOTDCN, /*! Received a DCN while waiting for a DIS */
255 T30_ERR_TX_INVALRSP, /*! Invalid response after sending a page */
256 T30_ERR_TX_NODIS, /*! Received other than DIS while waiting for DIS */
257 T30_ERR_TX_PHBDEAD, /*! Received no response to DCS, training or TCF */
258 T30_ERR_TX_PHDDEAD, /*! No response after sending a page */
259 T30_ERR_TX_T5EXP, /*! Timed out waiting for receiver ready (ECM mode) */
260
261 /* Phase E status values returned to a receiver */
262 T30_ERR_RX_ECMPHD, /*! Invalid ECM response received from transmitter */
263 T30_ERR_RX_GOTDCS, /*! DCS received while waiting for DTC */
264 T30_ERR_RX_INVALCMD, /*! Unexpected command after page received */
265 T30_ERR_RX_NOCARRIER, /*! Carrier lost during fax receive */
266 T30_ERR_RX_NOEOL, /*! Timed out while waiting for EOL (end Of line) */
267 T30_ERR_RX_NOFAX, /*! Timed out while waiting for first line */
268 T30_ERR_RX_T2EXPDCN, /*! Timer T2 expired while waiting for DCN */
269 T30_ERR_RX_T2EXPD, /*! Timer T2 expired while waiting for phase D */
270 T30_ERR_RX_T2EXPFAX, /*! Timer T2 expired while waiting for fax page */
271 T30_ERR_RX_T2EXPMPS, /*! Timer T2 expired while waiting for next fax page */
272 T30_ERR_RX_T2EXPRR, /*! Timer T2 expired while waiting for RR command */
273 T30_ERR_RX_T2EXP, /*! Timer T2 expired while waiting for NSS, DCS or MCF */
274 T30_ERR_RX_DCNWHY, /*! Unexpected DCN while waiting for DCS or DIS */
275 T30_ERR_RX_DCNDATA, /*! Unexpected DCN while waiting for image data */
276 T30_ERR_RX_DCNFAX, /*! Unexpected DCN while waiting for EOM, EOP or MPS */
277 T30_ERR_RX_DCNPHD, /*! Unexpected DCN after EOM or MPS sequence */
278 T30_ERR_RX_DCNRRD, /*! Unexpected DCN after RR/RNR sequence */
279 T30_ERR_RX_DCNNORTN, /*! Unexpected DCN after requested retransmission */
280
281 /* TIFF file problems */
282 T30_ERR_FILEERROR, /*! TIFF/F file cannot be opened */
283 T30_ERR_NOPAGE, /*! TIFF/F page not found */
284 T30_ERR_BADTIFF, /*! TIFF/F format is not compatible */
285 T30_ERR_BADPAGE, /*! TIFF/F page number tag missing */
286 T30_ERR_BADTAG, /*! Incorrect values for TIFF/F tags */
287 T30_ERR_BADTIFFHDR, /*! Bad TIFF/F header - incorrect values in fields */
288 T30_ERR_NOMEM, /*! Cannot allocate memory for more pages */
289
290 /* General problems */
291 T30_ERR_RETRYDCN, /*! Disconnected after permitted retries */
292 T30_ERR_CALLDROPPED, /*! The call dropped prematurely */
293
294 /* Feature negotiation issues */
295 T30_ERR_NOPOLL, /*! Poll not accepted */
296 T30_ERR_IDENT_UNACCEPTABLE, /*! Far end's ident is not acceptable */
297 T30_ERR_SUB_UNACCEPTABLE, /*! Far end's sub-address is not acceptable */
298 T30_ERR_SEP_UNACCEPTABLE, /*! Far end's selective polling address is not acceptable */
299 T30_ERR_PSA_UNACCEPTABLE, /*! Far end's polled sub-address is not acceptable */
300 T30_ERR_SID_UNACCEPTABLE, /*! Far end's sender identification is not acceptable */
301 T30_ERR_PWD_UNACCEPTABLE, /*! Far end's password is not acceptable */
302 T30_ERR_TSA_UNACCEPTABLE, /*! Far end's transmitting subscriber internet address is not acceptable */
303 T30_ERR_IRA_UNACCEPTABLE, /*! Far end's internet routing address is not acceptable */
304 T30_ERR_CIA_UNACCEPTABLE, /*! Far end's calling subscriber internet address is not acceptable */
305 T30_ERR_ISP_UNACCEPTABLE, /*! Far end's internet selective polling address is not acceptable */
306 T30_ERR_CSA_UNACCEPTABLE /*! Far end's called subscriber internet address is not acceptable */
307 };
308
309 /*!
310 I/O modes for the T.30 protocol.
311 These are allocated such that the lower 4 bits represents the variant of the modem - e.g. the
312 particular bit rate selected.
313 */
314 enum
315 {
316 T30_MODEM_NONE = 0,
317 T30_MODEM_PAUSE,
318 T30_MODEM_CED,
319 T30_MODEM_CNG,
320 T30_MODEM_V21,
321 T30_MODEM_V27TER,
322 T30_MODEM_V29,
323 T30_MODEM_V17,
324 T30_MODEM_DONE
325 };
326
327 enum
328 {
329 T30_FRONT_END_SEND_STEP_COMPLETE = 0,
330 /*! The current receive has completed. This is only needed to report an
331 unexpected end of the receive operation, as might happen with T.38
332 dying. */
333 T30_FRONT_END_RECEIVE_COMPLETE,
334 T30_FRONT_END_SIGNAL_PRESENT,
335 T30_FRONT_END_SIGNAL_ABSENT,
336 T30_FRONT_END_CED_PRESENT,
337 T30_FRONT_END_CNG_PRESENT
338 };
339
340 enum
341 {
342 /*! Support the V.27ter modem (2400, and 4800bps) for image transfer. */
343 T30_SUPPORT_V27TER = 0x01,
344 /*! Support the V.29 modem (9600, and 7200bps) for image transfer. */
345 T30_SUPPORT_V29 = 0x02,
346 /*! Support the V.17 modem (14400, 12000, 9600 and 7200bps) for image transfer. */
347 T30_SUPPORT_V17 = 0x04,
348 /*! Support the V.34 modem (up to 33,600bps) for image transfer. */
349 T30_SUPPORT_V34 = 0x08,
350 /*! Support the Internet aware FAX mode (no bit rate limit) for image transfer. */
351 T30_SUPPORT_IAF = 0x10
352 };
353
354 enum
355 {
356 /*! No compression */
357 T30_SUPPORT_NO_COMPRESSION = 0x01,
358 /*! T.1 1D compression */
359 T30_SUPPORT_T4_1D_COMPRESSION = 0x02,
360 /*! T.4 2D compression */
361 T30_SUPPORT_T4_2D_COMPRESSION = 0x04,
362 /*! T.6 2D compression */
363 T30_SUPPORT_T6_COMPRESSION = 0x08,
364 /*! T.85 monochrome JBIG compression */
365 T30_SUPPORT_T85_COMPRESSION = 0x10,
366 /*! T.43 colour JBIG compression */
367 T30_SUPPORT_T43_COMPRESSION = 0x20,
368 /*! T.45 run length colour compression */
369 T30_SUPPORT_T45_COMPRESSION = 0x40,
370 /*! T.81 + T.30 Annex E colour JPEG compression */
371 T30_SUPPORT_T81_COMPRESSION = 0x80,
372 /*! T.81 + T.30 Annex K colour sYCC-JPEG compression */
373 T30_SUPPORT_SYCC_T81_COMPRESSION = 0x100,
374 /*! T.88 monochrome JBIG2 compression */
375 T30_SUPPORT_T88_COMPRESSION = 0x200
376 };
377
378 enum
379 {
380 /*! Support standard FAX Y-resolution 98/100dpi */
381 T30_SUPPORT_STANDARD_RESOLUTION = 0x01,
382 /*! Support fine FAX Y-resolution 196/200dpi */
383 T30_SUPPORT_FINE_RESOLUTION = 0x02,
384 /*! Support super-fine FAX Y-resolution 392/400dpi */
385 T30_SUPPORT_SUPERFINE_RESOLUTION = 0x04,
386
387 /*! Support half FAX X-resolution 100/102dpi */
388 T30_SUPPORT_R4_RESOLUTION = 0x10000,
389 /*! Support standard FAX X-resolution 200/204dpi */
390 T30_SUPPORT_R8_RESOLUTION = 0x20000,
391 /*! Support double FAX X-resolution 400dpi */
392 T30_SUPPORT_R16_RESOLUTION = 0x40000,
393
394 /*! Support 300dpi x 300 dpi */
395 T30_SUPPORT_300_300_RESOLUTION = 0x100000,
396 /*! Support 400dpi x 400 dpi */
397 T30_SUPPORT_400_400_RESOLUTION = 0x200000,
398 /*! Support 600dpi x 600 dpi */
399 T30_SUPPORT_600_600_RESOLUTION = 0x400000,
400 /*! Support 1200dpi x 1200 dpi */
401 T30_SUPPORT_1200_1200_RESOLUTION = 0x800000,
402 /*! Support 300dpi x 600 dpi */
403 T30_SUPPORT_300_600_RESOLUTION = 0x1000000,
404 /*! Support 400dpi x 800 dpi */
405 T30_SUPPORT_400_800_RESOLUTION = 0x2000000,
406 /*! Support 600dpi x 1200 dpi */
407 T30_SUPPORT_600_1200_RESOLUTION = 0x4000000
408 };
409
410 enum
411 {
412 T30_SUPPORT_215MM_WIDTH = 0x01,
413 T30_SUPPORT_255MM_WIDTH = 0x02,
414 T30_SUPPORT_303MM_WIDTH = 0x04,
415
416 T30_SUPPORT_UNLIMITED_LENGTH = 0x10000,
417 T30_SUPPORT_A4_LENGTH = 0x20000,
418 T30_SUPPORT_B4_LENGTH = 0x40000,
419 T30_SUPPORT_US_LETTER_LENGTH = 0x80000,
420 T30_SUPPORT_US_LEGAL_LENGTH = 0x100000
421 };
422
423 enum
424 {
425 /*! Enable support of identification, through the SID and/or PWD frames. */
426 T30_SUPPORT_IDENTIFICATION = 0x01,
427 /*! Enable support of selective polling, through the SEP frame. */
428 T30_SUPPORT_SELECTIVE_POLLING = 0x02,
429 /*! Enable support of polling sub-addressing, through the PSA frame. */
430 T30_SUPPORT_POLLED_SUB_ADDRESSING = 0x04,
431 /*! Enable support of multiple selective polling, through repeated used of the SEP and PSA frames. */
432 T30_SUPPORT_MULTIPLE_SELECTIVE_POLLING = 0x08,
433 /*! Enable support of sub-addressing, through the SUB frame. */
434 T30_SUPPORT_SUB_ADDRESSING = 0x10,
435 /*! Enable support of transmitting subscriber internet address, through the TSA frame. */
436 T30_SUPPORT_TRANSMITTING_SUBSCRIBER_INTERNET_ADDRESS = 0x20,
437 /*! Enable support of internet routing address, through the IRA frame. */
438 T30_SUPPORT_INTERNET_ROUTING_ADDRESS = 0x40,
439 /*! Enable support of calling subscriber internet address, through the CIA frame. */
440 T30_SUPPORT_CALLING_SUBSCRIBER_INTERNET_ADDRESS = 0x80,
441 /*! Enable support of internet selective polling address, through the ISP frame. */
442 T30_SUPPORT_INTERNET_SELECTIVE_POLLING_ADDRESS = 0x100,
443 /*! Enable support of called subscriber internet address, through the CSA frame. */
444 T30_SUPPORT_CALLED_SUBSCRIBER_INTERNET_ADDRESS = 0x200,
445 /*! Enable support of the field not valid (FNV) frame. */
446 T30_SUPPORT_FIELD_NOT_VALID = 0x400,
447 /*! Enable support of the command repeat (CRP) frame. */
448 T30_SUPPORT_COMMAND_REPEAT = 0x800
449 };
450
451 enum
452 {
453 T30_IAF_MODE_T37 = 0x01,
454 T30_IAF_MODE_T38 = 0x02,
455 T30_IAF_MODE_FLOW_CONTROL = 0x04,
456 /*! Continuous flow mode means data is sent as fast as possible, usually across
457 the Internet, where speed is not constrained by a PSTN modem. */
458 T30_IAF_MODE_CONTINUOUS_FLOW = 0x08,
459 /*! No TCF means TCF is not exchanged. The end points must sort out usable speed
460 issues locally. */
461 T30_IAF_MODE_NO_TCF = 0x10,
462 /*! No fill bits means do not insert fill bits, even if the T.30 messages request
463 them. */
464 T30_IAF_MODE_NO_FILL_BITS = 0x20,
465 /*! No indicators means do not send indicator messages when using T.38. */
466 T30_IAF_MODE_NO_INDICATORS = 0x40,
467 /*! Use relaxed timers for T.38. This is appropriate when using TCP/TPKT for T.38,
468 as there is no point in anything but a long backstop timeout in such a mode. */
469 T30_IAF_MODE_RELAXED_TIMERS = 0x80
470 };
471
472 typedef struct
473 {
474 /*! \brief The identifier string (CSI, TSI, CIG). */
475 char ident[T30_MAX_IDENT_LEN + 1];
476 /*! \brief The sub-address string (SUB). */
477 char sub_address[T30_MAX_IDENT_LEN + 1];
478 /*! \brief The selective polling sub-address (SEP). */
479 char selective_polling_address[T30_MAX_IDENT_LEN + 1];
480 /*! \brief The polled sub-address (PSA). */
481 char polled_sub_address[T30_MAX_IDENT_LEN + 1];
482 /*! \brief The sender identification (SID). */
483 char sender_ident[T30_MAX_IDENT_LEN + 1];
484 /*! \brief The password (PWD). */
485 char password[T30_MAX_IDENT_LEN + 1];
486 /*! \brief Non-standard facilities (NSF). */
487 uint8_t *nsf;
488 size_t nsf_len;
489 /*! \brief Non-standard facilities command (NSC). */
490 uint8_t *nsc;
491 size_t nsc_len;
492 /*! \brief Non-standard facilities set-up (NSS). */
493 uint8_t *nss;
494 size_t nss_len;
495 /*! \brief Transmitting subscriber internet address (TSA). */
496 int tsa_type;
497 char *tsa;
498 size_t tsa_len;
499 /*! \brief Internet routing address (IRA). */
500 int ira_type;
501 char *ira;
502 size_t ira_len;
503 /*! \brief Calling subscriber internet address (CIA). */
504 int cia_type;
505 char *cia;
506 size_t cia_len;
507 /*! \brief Internet selective polling address (ISP). */
508 int isp_type;
509 char *isp;
510 size_t isp_len;
511 /*! \brief Called subscriber internet address (CSA). */
512 int csa_type;
513 char *csa;
514 size_t csa_len;
515 } t30_exchanged_info_t;
516
517 typedef struct
518 {
519 /*! \brief The current bit rate for image transfer. */
520 int bit_rate;
521 /*! \brief TRUE if error correcting mode is used. */
522 int error_correcting_mode;
523 /*! \brief The number of pages sent so far. */
524 int pages_tx;
525 /*! \brief The number of pages received so far. */
526 int pages_rx;
527 /*! \brief The number of pages in the file (<0 if not known). */
528 int pages_in_file;
529 /*! \brief The horizontal column-to-column resolution of the most recent page, in pixels per metre */
530 int x_resolution;
531 /*! \brief The vertical row-to-row resolution of the most recent page, in pixels per metre */
532 int y_resolution;
533 /*! \brief The number of horizontal pixels in the most recent page. */
534 int width;
535 /*! \brief The number of vertical pixels in the most recent page. */
536 int length;
537 /*! \brief The size of the image, in bytes */
538 int image_size;
539 /*! \brief The type of compression used between the FAX machines */
540 int encoding;
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 number of HDLC frame retries, if error correcting mode is used. */
546 int error_correcting_mode_retries;
547 /*! \brief Current status */
548 int current_status;
549 } t30_stats_t;
550
551 #if defined(__cplusplus)
552 extern "C"
553 {
554 #endif
555
556 /*! Initialise a T.30 context.
557 \brief Initialise a T.30 context.
558 \param s The T.30 context.
559 \param calling_party TRUE if the context is for a calling party. FALSE if the
560 context is for an answering party.
561 \param set_rx_type_handler
562 \param set_rx_type_user_data
563 \param set_tx_type_handler
564 \param set_tx_type_user_data
565 \param send_hdlc_handler
566 \param send_hdlc_user_data
567 \return A pointer to the context, or NULL if there was a problem. */
568 SPAN_DECLARE(t30_state_t *) t30_init(t30_state_t *s,
569 int calling_party,
570 t30_set_handler_t *set_rx_type_handler,
571 void *set_rx_type_user_data,
572 t30_set_handler_t *set_tx_type_handler,
573 void *set_tx_type_user_data,
574 t30_send_hdlc_handler_t *send_hdlc_handler,
575 void *send_hdlc_user_data);
576
577 /*! Release a T.30 context.
578 \brief Release a T.30 context.
579 \param s The T.30 context.
580 \return 0 for OK, else -1. */
581 SPAN_DECLARE(int) t30_release(t30_state_t *s);
582
583 /*! Free a T.30 context.
584 \brief Free a T.30 context.
585 \param s The T.30 context.
586 \return 0 for OK, else -1. */
587 SPAN_DECLARE(int) t30_free(t30_state_t *s);
588
589 /*! Restart a T.30 context.
590 \brief Restart a T.30 context.
591 \param s The T.30 context.
592 \return 0 for OK, else -1. */
593 SPAN_DECLARE(int) t30_restart(t30_state_t *s);
594
595 /*! Check if a T.30 call is still active. This may be used to regularly poll
596 if the job has finished.
597 \brief Check if a T.30 call is still active.
598 \param s The T.30 context.
599 \return TRUE for call still active, or FALSE for call completed. */
600 SPAN_DECLARE(int) t30_call_active(t30_state_t *s);
601
602 /*! Cleanup a T.30 context if the call terminates.
603 \brief Cleanup a T.30 context if the call terminates.
604 \param s The T.30 context. */
605 SPAN_DECLARE(void) t30_terminate(t30_state_t *s);
606
607 /*! Inform the T.30 engine of a status change in the front end (end of tx, rx signal change, etc.).
608 \brief Inform the T.30 engine of a status change in the front end (end of tx, rx signal change, etc.).
609 \param user_data The T.30 context.
610 \param status The type of status change which occured. */
611 SPAN_DECLARE(void) t30_front_end_status(void *user_data, int status);
612
613 /*! Get a bit of received non-ECM image data.
614 \brief Get a bit of received non-ECM image data.
615 \param user_data An opaque pointer, which must point to the T.30 context.
616 \return The next bit to transmit. */
617 SPAN_DECLARE_NONSTD(int) t30_non_ecm_get_bit(void *user_data);
618
619 /*! Get a byte of received non-ECM image data.
620 \brief Get a byte of received non-ECM image data.
621 \param user_data An opaque pointer, which must point to the T.30 context.
622 \return The next byte to transmit. */
623 SPAN_DECLARE(int) t30_non_ecm_get_byte(void *user_data);
624
625 /*! Get a chunk of received non-ECM image data.
626 \brief Get a bit of received non-ECM image data.
627 \param user_data An opaque pointer, which must point to the T.30 context.
628 \param buf The buffer to contain the data.
629 \param max_len The maximum length of the chunk.
630 \return The actual length of the chunk. */
631 SPAN_DECLARE(int) t30_non_ecm_get_chunk(void *user_data, uint8_t buf[], int max_len);
632
633 /*! Process a bit of received non-ECM image data.
634 \brief Process a bit of received non-ECM image data
635 \param user_data An opaque pointer, which must point to the T.30 context.
636 \param bit The received bit. */
637 SPAN_DECLARE_NONSTD(void) t30_non_ecm_put_bit(void *user_data, int bit);
638
639 /*! Process a byte of received non-ECM image data.
640 \brief Process a byte of received non-ECM image data
641 \param user_data An opaque pointer, which must point to the T.30 context.
642 \param byte The received byte. */
643 SPAN_DECLARE(void) t30_non_ecm_put_byte(void *user_data, int byte);
644
645 /*! Process a chunk of received non-ECM image data.
646 \brief Process a chunk of received non-ECM image data
647 \param user_data An opaque pointer, which must point to the T.30 context.
648 \param buf The buffer containing the received data.
649 \param len The length of the data in buf. */
650 SPAN_DECLARE(void) t30_non_ecm_put_chunk(void *user_data, const uint8_t buf[], int len);
651
652 /*! Process a received HDLC frame.
653 \brief Process a received HDLC frame.
654 \param user_data The T.30 context.
655 \param msg The HDLC message.
656 \param len The length of the message, in octets.
657 \param ok TRUE if the frame was received without error. */
658 SPAN_DECLARE_NONSTD(void) t30_hdlc_accept(void *user_data, const uint8_t msg[], int len, int ok);
659
660 /*! Report the passage of time to the T.30 engine.
661 \brief Report the passage of time to the T.30 engine.
662 \param s The T.30 context.
663 \param samples The time change in 1/8000th second steps. */
664 SPAN_DECLARE(void) t30_timer_update(t30_state_t *s, int samples);
665
666 /*! Get the current transfer statistics for the file being sent or received.
667 \brief Get the current transfer statistics.
668 \param s The T.30 context.
669 \param t A pointer to a buffer for the statistics. */
670 SPAN_DECLARE(void) t30_get_transfer_statistics(t30_state_t *s, t30_stats_t *t);
671
672 /*! Request a local interrupt of FAX exchange.
673 \brief Request a local interrupt of FAX exchange.
674 \param s The T.30 context.
675 \param state TRUE to enable interrupt request, else FALSE. */
676 SPAN_DECLARE(void) t30_local_interrupt_request(t30_state_t *s, int state);
677
678 #if defined(__cplusplus)
679 }
680 #endif
681
682 #endif
683 /*- End of file ------------------------------------------------------------*/

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