spandsp  3.0.0
private/t38_gateway.h
Go to the documentation of this file.
1 /*
2  * SpanDSP - a series of DSP components for telephony
3  *
4  * private/t38_gateway.h - A T.38, less the packet exchange part
5  *
6  * Written by Steve Underwood <steveu@coppice.org>
7  *
8  * Copyright (C) 2005, 2006, 2007 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 
26 /*! \file */
27 
28 #if !defined(_SPANDSP_PRIVATE_T38_GATEWAY_H_)
29 #define _SPANDSP_PRIVATE_T38_GATEWAY_H_
30 
31 /*! The number of HDLC transmit buffers */
32 #define T38_TX_HDLC_BUFS 256
33 /*! The maximum length of an HDLC frame buffer. This must be big enough for ECM frames. */
34 #define T38_MAX_HDLC_LEN 260
35 /*! The receive buffer length */
36 #define T38_RX_BUF_LEN 2048
37 
38 /*!
39  T.38 gateway T.38 side channel descriptor.
40 */
41 typedef struct
42 {
43  /*! \brief Core T.38 IFP support */
45 
46  /*! \brief If NSF, NSC, and NSS are to be suppressed by altering their contents to
47  something the far end will not recognise, this is the amount to overwrite. */
48  int suppress_nsx_len[2];
49  /*! \brief If NSF, NSC, and NSS are to be suppressed by altering their contents to
50  something the far end will not recognise, this is the string to use for overwriting. */
51  uint8_t suppress_nsx_string[2][MAX_NSX_SUPPRESSION];
52 
53  /*! \brief True if we need to corrupt the HDLC frame in progress, so the receiver cannot
54  interpret it. The two values are for the two directions. */
55  bool corrupt_current_frame[2];
56 
57  /*! \brief the current class of field being received - i.e. none, non-ECM or HDLC */
59  /*! \brief The T.38 indicator currently in use */
61 
62  /*! \brief The current T.38 data type being sent. */
65 
66 /*!
67  T.38 gateway audio side channel descriptor.
68 */
69 typedef struct
70 {
71  /*! \brief The FAX modem set for the audio side fo the gateway. */
74 
75 /*!
76  T.38 gateway T.38 side state.
77 */
78 typedef struct
79 {
80  /*! \brief non-ECM and HDLC modem receive data buffer. */
81  uint8_t data[T38_RX_BUF_LEN];
82  /*! \brief Current pointer into the data buffer. */
83  int data_ptr;
84  /*! \brief The current octet being received as non-ECM data. */
85  uint16_t bit_stream;
86  /*! \brief The number of bits taken from the modem for the current scan row. This
87  is used during non-ECM transmission with fill bit removal to see that
88  T.38 packet transmissions do not stretch too far apart. */
90  /*! \brief The current bit number in the current non-ECM octet. */
91  int bit_no;
92  /*! \brief Progressively calculated CRC for HDLC messages received from a modem. */
93  uint16_t crc;
94  /*! \brief True if non-ECM fill bits are to be stripped when sending image data. */
96  /*! \brief The number of octets to send in each image packet (non-ECM or ECM) at
97  the current rate and the current specified packet interval. */
99 
100  /*! \brief The number of bits into the non-ECM buffer */
101  int in_bits;
102  /*! \brief The number of octets fed out from the non-ECM buffer */
105 
106 /*!
107  T.38 gateway HDLC buffer.
108 */
109 typedef struct
110 {
111  /*! \brief HDLC message buffers. */
112  uint8_t buf[T38_MAX_HDLC_LEN];
113  /*! \brief HDLC message lengths. */
114  int16_t len;
115  /*! \brief HDLC message status flags. */
116  uint16_t flags;
117  /*! \brief HDLC buffer contents. */
118  int16_t contents;
120 
121 /*!
122  T.38 gateway HDLC state.
123 */
124 typedef struct
125 {
126  /*! \brief HDLC message buffers. */
128  /*! \brief HDLC buffer number for input. */
129  int in;
130  /*! \brief HDLC buffer number for output. */
131  int out;
133 
134 /*!
135  T.38 gateway core descriptor.
136 */
137 typedef struct
138 {
139  /*! \brief A bit mask of the currently supported modem types. */
141  /*! \brief True if ECM FAX mode is allowed through the gateway. */
143  /*! \brief Required time between T.38 transmissions, in ms. */
145 
146  /*! \brief True if in image data modem is to use short training. This usually
147  follows image_data_mode, but in ECM mode T.30 defines recovery
148  conditions in which long training is used for image data. */
150  /*! \brief True if in image data mode, as opposed to TCF mode. */
152  /*! \brief The minimum permitted bits per FAX scan line row. */
154 
155  /*! \brief True if we should count the next MCF as a page end, else false */
157  /*! \brief The number of pages for which a confirm (MCF) message was returned. */
159 
160  /*! \brief True if we are in error correcting (ECM) mode */
161  bool ecm_mode;
162  /*! \brief The current bit rate for the fast modem. */
164  /*! \brief The current fast receive modem type. */
166  /*! \brief The type of fast receive modem currently active, which may be T38_NONE */
168 
169  /*! \brief The current timed operation. */
171  /*! \brief The number of samples until the next timeout event */
173 
174  /*! Buffer for HDLC and non-ECM data going to the T.38 channel */
176  /*! Buffer for data going to an HDLC modem. */
178  /*! Buffer for data going to a non-ECM mode modem. */
180 
181  /*! \brief A pointer to a callback routine to be called when frames are
182  exchanged. */
184  /*! \brief An opaque pointer supplied in real time frame callbacks. */
187 
188 /*!
189  T.38 gateway state.
190 */
192 {
193  /*! T.38 side state */
195  /*! Audio side state */
197  /*! T.38 core state */
199 
200  /*! \brief Error and flow logging control */
202 };
203 
204 #endif
205 /*- End of file ------------------------------------------------------------*/
uint16_t flags
HDLC message status flags.
Definition: private/t38_gateway.h:116
int pages_confirmed
The number of pages for which a confirm (MCF) message was returned.
Definition: private/t38_gateway.h:158
t38_gateway_to_t38_state_t to_t38
Definition: private/t38_gateway.h:175
Definition: private/t38_gateway.h:78
t38_gateway_real_time_frame_handler_t real_time_frame_handler
A pointer to a callback routine to be called when frames are exchanged.
Definition: private/t38_gateway.h:183
bool ecm_allowed
True if ECM FAX mode is allowed through the gateway.
Definition: private/t38_gateway.h:142
void(* t38_gateway_real_time_frame_handler_t)(void *user_data, bool incoming, const uint8_t *msg, int len)
T.38 gateway real time frame handler.
Definition: t38_gateway.h:55
int fast_bit_rate
The current bit rate for the fast modem.
Definition: private/t38_gateway.h:163
#define T38_RX_BUF_LEN
Definition: private/t38_gateway.h:36
A flow controlled non-ECM image data buffer, for buffering T.38 to analogue modem data...
Definition: private/t38_non_ecm_buffer.h:33
bool image_data_mode
True if in image data mode, as opposed to TCF mode.
Definition: private/t38_gateway.h:151
int fast_rx_active
The type of fast receive modem currently active, which may be T38_NONE.
Definition: private/t38_gateway.h:167
#define T38_MAX_HDLC_LEN
Definition: private/t38_gateway.h:34
t38_non_ecm_buffer_state_t non_ecm_to_modem
Definition: private/t38_gateway.h:179
t38_gateway_audio_state_t audio
Definition: private/t38_gateway.h:196
Definition: private/t38_gateway.h:41
int data_ptr
Current pointer into the data buffer.
Definition: private/t38_gateway.h:83
int bits_absorbed
The number of bits taken from the modem for the current scan row. This is used during non-ECM transmi...
Definition: private/t38_gateway.h:89
void * real_time_frame_user_data
An opaque pointer supplied in real time frame callbacks.
Definition: private/t38_gateway.h:185
Definition: private/t38_gateway.h:69
int out
HDLC buffer number for output.
Definition: private/t38_gateway.h:131
t38_core_state_t t38
Core T.38 IFP support.
Definition: private/t38_gateway.h:44
bool count_page_on_mcf
True if we should count the next MCF as a page end, else false.
Definition: private/t38_gateway.h:156
fax_modems_state_t modems
The FAX modem set for the audio side fo the gateway.
Definition: private/t38_gateway.h:72
#define T38_TX_HDLC_BUFS
Definition: private/t38_gateway.h:32
int fast_rx_modem
The current fast receive modem type.
Definition: private/t38_gateway.h:165
int in_bits
The number of bits into the non-ECM buffer.
Definition: private/t38_gateway.h:101
Definition: private/t38_gateway.h:137
t38_gateway_core_state_t core
Definition: private/t38_gateway.h:198
int16_t len
HDLC message lengths.
Definition: private/t38_gateway.h:114
bool ecm_mode
True if we are in error correcting (ECM) mode.
Definition: private/t38_gateway.h:161
int current_tx_data_type
The current T.38 data type being sent.
Definition: private/t38_gateway.h:63
uint16_t bit_stream
The current octet being received as non-ECM data.
Definition: private/t38_gateway.h:85
logging_state_t logging
Error and flow logging control.
Definition: private/t38_gateway.h:201
int timed_mode
The current timed operation.
Definition: private/t38_gateway.h:170
int samples_to_timeout
The number of samples until the next timeout event.
Definition: private/t38_gateway.h:172
t38_gateway_hdlc_state_t hdlc_to_modem
Definition: private/t38_gateway.h:177
int in
HDLC buffer number for input.
Definition: private/t38_gateway.h:129
Definition: private/fax_modems.h:34
int ms_per_tx_chunk
Required time between T.38 transmissions, in ms.
Definition: private/t38_gateway.h:144
uint16_t crc
Progressively calculated CRC for HDLC messages received from a modem.
Definition: private/t38_gateway.h:93
Definition: private/t38_gateway.h:124
int bit_no
The current bit number in the current non-ECM octet.
Definition: private/t38_gateway.h:91
int supported_modems
A bit mask of the currently supported modem types.
Definition: private/t38_gateway.h:140
Definition: private/logging.h:33
int octets_per_data_packet
The number of octets to send in each image packet (non-ECM or ECM) at the current rate and the curren...
Definition: private/t38_gateway.h:98
Definition: private/t38_gateway.h:191
int16_t contents
HDLC buffer contents.
Definition: private/t38_gateway.h:118
int current_rx_field_class
the current class of field being received - i.e. none, non-ECM or HDLC
Definition: private/t38_gateway.h:58
t38_gateway_t38_state_t t38x
Definition: private/t38_gateway.h:194
bool fill_bit_removal
True if non-ECM fill bits are to be stripped when sending image data.
Definition: private/t38_gateway.h:95
bool short_train
True if in image data modem is to use short training. This usually follows image_data_mode, but in ECM mode T.30 defines recovery conditions in which long training is used for image data.
Definition: private/t38_gateway.h:149
Definition: private/t38_gateway.h:109
int in_progress_rx_indicator
The T.38 indicator currently in use.
Definition: private/t38_gateway.h:60
Definition: private/t38_core.h:32
#define MAX_NSX_SUPPRESSION
Definition: t38_gateway.h:43
int min_row_bits
The minimum permitted bits per FAX scan line row.
Definition: private/t38_gateway.h:153
int out_octets
The number of octets fed out from the non-ECM buffer.
Definition: private/t38_gateway.h:103