提交 f758d53e authored 作者: Steve Underwood's avatar Steve Underwood

Some preparations for colour FAX

上级 e23b6a22
...@@ -437,18 +437,17 @@ static const struct ademco_code_s ademco_codes[] = ...@@ -437,18 +437,17 @@ static const struct ademco_code_s ademco_codes[] =
{-1, "???"} {-1, "???"}
}; };
#if defined(SPANDSP_USE_FIXED_POINT)
#define GOERTZEL_SAMPLES_PER_BLOCK 55 /* We need to detect over a +-5% range */ #define GOERTZEL_SAMPLES_PER_BLOCK 55 /* We need to detect over a +-5% range */
#define DETECTION_THRESHOLD 16439 /* -42dBm0 [((GOERTZEL_SAMPLES_PER_BLOCK*GOERTZEL_SAMPLES_PER_BLOCK*32768.0/(1.4142*128.0))*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2] */
#define TONE_TWIST 4 /* 6dB */ #if defined(SPANDSP_USE_FIXED_POINT)
#define TONE_TO_TOTAL_ENERGY 64 /* -3dB */ #define DETECTION_THRESHOLD 3035 /* -42dBm0 */
#define TONE_TO_TOTAL_ENERGY 45.2233f /* -0.85dB */
#else #else
#define GOERTZEL_SAMPLES_PER_BLOCK 55 /* We need to detect over a +-5% range */ #define DETECTION_THRESHOLD 49728296.6f /* -42dBm0 [((GOERTZEL_SAMPLES_PER_BLOCK*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2] */
#define DETECTION_THRESHOLD 2104205.6f /* -42dBm0 [((GOERTZEL_SAMPLES_PER_BLOCK*GOERTZEL_SAMPLES_PER_BLOCK*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2] */ #define TONE_TO_TOTAL_ENERGY 45.2233f /* -0.85dB [GOERTZEL_SAMPLES_PER_BLOCK*10^(-0.85/10.0)] */
#define TONE_TWIST 3.981f /* 6dB */
#define TONE_TO_TOTAL_ENERGY 1.995f /* 3dB */
#endif #endif
static int tone_rx_init = FALSE;
static goertzel_descriptor_t tone_1400_desc; static goertzel_descriptor_t tone_1400_desc;
static goertzel_descriptor_t tone_2300_desc; static goertzel_descriptor_t tone_2300_desc;
...@@ -1083,8 +1082,6 @@ SPAN_DECLARE(ademco_contactid_sender_state_t *) ademco_contactid_sender_init(ade ...@@ -1083,8 +1082,6 @@ SPAN_DECLARE(ademco_contactid_sender_state_t *) ademco_contactid_sender_init(ade
tone_report_func_t callback, tone_report_func_t callback,
void *user_data) void *user_data)
{ {
static int initialised = FALSE;
if (s == NULL) if (s == NULL)
{ {
if ((s = (ademco_contactid_sender_state_t *) malloc(sizeof (*s))) == NULL) if ((s = (ademco_contactid_sender_state_t *) malloc(sizeof (*s))) == NULL)
...@@ -1094,10 +1091,11 @@ SPAN_DECLARE(ademco_contactid_sender_state_t *) ademco_contactid_sender_init(ade ...@@ -1094,10 +1091,11 @@ SPAN_DECLARE(ademco_contactid_sender_state_t *) ademco_contactid_sender_init(ade
span_log_init(&s->logging, SPAN_LOG_NONE, NULL); span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
span_log_set_protocol(&s->logging, "Ademco"); span_log_set_protocol(&s->logging, "Ademco");
if (!initialised) if (!tone_rx_init)
{ {
make_goertzel_descriptor(&tone_1400_desc, 1400.0f, GOERTZEL_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&tone_1400_desc, 1400.0f, GOERTZEL_SAMPLES_PER_BLOCK);
make_goertzel_descriptor(&tone_2300_desc, 2300.0f, GOERTZEL_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&tone_2300_desc, 2300.0f, GOERTZEL_SAMPLES_PER_BLOCK);
tone_rx_init = TRUE;
} }
goertzel_init(&s->tone_1400, &tone_1400_desc); goertzel_init(&s->tone_1400, &tone_1400_desc);
goertzel_init(&s->tone_2300, &tone_2300_desc); goertzel_init(&s->tone_2300, &tone_2300_desc);
......
...@@ -62,6 +62,8 @@ ...@@ -62,6 +62,8 @@
#define DEFAULT_DTMF_TX_ON_TIME 50 #define DEFAULT_DTMF_TX_ON_TIME 50
#define DEFAULT_DTMF_TX_OFF_TIME 55 #define DEFAULT_DTMF_TX_OFF_TIME 55
#define DTMF_SAMPLES_PER_BLOCK 102
#if defined(SPANDSP_USE_FIXED_POINT) #if defined(SPANDSP_USE_FIXED_POINT)
#define DTMF_THRESHOLD 10438 /* -42dBm0 */ #define DTMF_THRESHOLD 10438 /* -42dBm0 */
#define DTMF_NORMAL_TWIST 6.309f /* 8dB */ #define DTMF_NORMAL_TWIST 6.309f /* 8dB */
...@@ -70,16 +72,14 @@ ...@@ -70,16 +72,14 @@
#define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */ #define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */
#define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB */ #define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB */
#define DTMF_POWER_OFFSET 68.251f /* 10*log(256.0*256.0*DTMF_SAMPLES_PER_BLOCK) */ #define DTMF_POWER_OFFSET 68.251f /* 10*log(256.0*256.0*DTMF_SAMPLES_PER_BLOCK) */
#define DTMF_SAMPLES_PER_BLOCK 102
#else #else
#define DTMF_THRESHOLD 171032462.0f /* -42dBm0 [((DTMF_SAMPLES_PER_BLOCK*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2 => 171032462.0] */ #define DTMF_THRESHOLD 171032462.0f /* -42dBm0 [((DTMF_SAMPLES_PER_BLOCK*32768.0/1.4142)*10^((-42 - DBM0_MAX_SINE_POWER)/20.0))^2] */
#define DTMF_NORMAL_TWIST 6.309f /* 8dB [10^(8/10) => 6.309] */ #define DTMF_NORMAL_TWIST 6.309f /* 8dB [10^(8/10) => 6.309] */
#define DTMF_REVERSE_TWIST 2.512f /* 4dB */ #define DTMF_REVERSE_TWIST 2.512f /* 4dB */
#define DTMF_RELATIVE_PEAK_ROW 6.309f /* 8dB */ #define DTMF_RELATIVE_PEAK_ROW 6.309f /* 8dB */
#define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */ #define DTMF_RELATIVE_PEAK_COL 6.309f /* 8dB */
#define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB [DTMF_SAMPLES_PER_BLOCK*10^(-0.85/10.0)] */ #define DTMF_TO_TOTAL_ENERGY 83.868f /* -0.85dB [DTMF_SAMPLES_PER_BLOCK*10^(-0.85/10.0)] */
#define DTMF_POWER_OFFSET 110.395f /* 10*log(32768.0*32768.0*DTMF_SAMPLES_PER_BLOCK) */ #define DTMF_POWER_OFFSET 110.395f /* 10*log(32768.0*32768.0*DTMF_SAMPLES_PER_BLOCK) */
#define DTMF_SAMPLES_PER_BLOCK 102
#endif #endif
static const float dtmf_row[] = static const float dtmf_row[] =
...@@ -93,6 +93,7 @@ static const float dtmf_col[] = ...@@ -93,6 +93,7 @@ static const float dtmf_col[] =
static const char dtmf_positions[] = "123A" "456B" "789C" "*0#D"; static const char dtmf_positions[] = "123A" "456B" "789C" "*0#D";
static int dtmf_rx_inited = FALSE;
static goertzel_descriptor_t dtmf_detect_row[4]; static goertzel_descriptor_t dtmf_detect_row[4];
static goertzel_descriptor_t dtmf_detect_col[4]; static goertzel_descriptor_t dtmf_detect_col[4];
...@@ -409,7 +410,6 @@ SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s, ...@@ -409,7 +410,6 @@ SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s,
void *user_data) void *user_data)
{ {
int i; int i;
static int initialised = FALSE;
if (s == NULL) if (s == NULL)
{ {
...@@ -431,14 +431,14 @@ SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s, ...@@ -431,14 +431,14 @@ SPAN_DECLARE(dtmf_rx_state_t *) dtmf_rx_init(dtmf_rx_state_t *s,
s->in_digit = 0; s->in_digit = 0;
s->last_hit = 0; s->last_hit = 0;
if (!initialised) if (!dtmf_rx_inited)
{ {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
make_goertzel_descriptor(&dtmf_detect_row[i], dtmf_row[i], DTMF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&dtmf_detect_row[i], dtmf_row[i], DTMF_SAMPLES_PER_BLOCK);
make_goertzel_descriptor(&dtmf_detect_col[i], dtmf_col[i], DTMF_SAMPLES_PER_BLOCK); make_goertzel_descriptor(&dtmf_detect_col[i], dtmf_col[i], DTMF_SAMPLES_PER_BLOCK);
} }
initialised = TRUE; dtmf_rx_inited = TRUE;
} }
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
......
...@@ -52,8 +52,10 @@ struct t30_state_s ...@@ -52,8 +52,10 @@ struct t30_state_s
int supported_modems; int supported_modems;
/*! \brief A bit mask of the currently supported image compression modes. */ /*! \brief A bit mask of the currently supported image compression modes. */
int supported_compressions; int supported_compressions;
/*! \brief A bit mask of the currently supported image resolutions. */ /*! \brief A bit mask of the currently supported bi-level image resolutions. */
int supported_resolutions; int supported_bilevel_resolutions;
/*! \brief A bit mask of the currently supported colour image resolutions. */
int supported_colour_resolutions;
/*! \brief A bit mask of the currently supported image sizes. */ /*! \brief A bit mask of the currently supported image sizes. */
int supported_image_sizes; int supported_image_sizes;
/*! \brief A bit mask of the currently supported T.30 special features. */ /*! \brief A bit mask of the currently supported T.30 special features. */
...@@ -218,6 +220,12 @@ struct t30_state_s ...@@ -218,6 +220,12 @@ struct t30_state_s
/*! \brief TRUE if a local T.30 interrupt is pending. */ /*! \brief TRUE if a local T.30 interrupt is pending. */
int local_interrupt_pending; int local_interrupt_pending;
/*! \brief The common ground in compression schemes between the local and far ends. */
int mutual_compressions;
/*! \brief The common group supported bi-level image resolutions. */
int mutual_bilevel_resolutions;
/*! \brief The common group supported colour image resolutions. */
int mutual_colour_resolutions;
/*! \brief The image coding to be used on the line for non-bilevel images. */ /*! \brief The image coding to be used on the line for non-bilevel images. */
int multilevel_line_encoding; int multilevel_line_encoding;
/*! \brief The image coding being used on the line. */ /*! \brief The image coding being used on the line. */
......
...@@ -33,6 +33,7 @@ struct v18_state_s ...@@ -33,6 +33,7 @@ struct v18_state_s
int mode; int mode;
put_msg_func_t put_msg; put_msg_func_t put_msg;
void *user_data; void *user_data;
int repeat_shifts;
union union
{ {
...@@ -46,6 +47,7 @@ struct v18_state_s ...@@ -46,6 +47,7 @@ struct v18_state_s
async_tx_state_t asynctx; async_tx_state_t asynctx;
int baudot_tx_shift; int baudot_tx_shift;
int tx_signal_on; int tx_signal_on;
uint8_t next_byte;
int byte_no; int byte_no;
fsk_rx_state_t fskrx; fsk_rx_state_t fskrx;
...@@ -56,7 +58,7 @@ struct v18_state_s ...@@ -56,7 +58,7 @@ struct v18_state_s
int rx_msg_len; int rx_msg_len;
int bit_pos; int bit_pos;
int in_progress; int in_progress;
int repeat_shifts; int rx_suppression;
/*! \brief Error and flow logging control */ /*! \brief Error and flow logging control */
logging_state_t logging; logging_state_t logging;
......
...@@ -369,7 +369,7 @@ enum ...@@ -369,7 +369,7 @@ enum
/*! T.45 run length colour compression */ /*! T.45 run length colour compression */
T30_SUPPORT_COMPRESSION_T45 = 0x80, T30_SUPPORT_COMPRESSION_T45 = 0x80,
/*! T.81 + T.30 Annex E colour JPEG compression */ /*! T.81 + T.30 Annex E colour JPEG compression */
T30_SUPPORT_COMPRESSION_T81 = 0x100, T30_SUPPORT_COMPRESSION_T42_T81 = 0x100,
/*! T.81 + T.30 Annex K colour sYCC-JPEG compression */ /*! T.81 + T.30 Annex K colour sYCC-JPEG compression */
T30_SUPPORT_COMPRESSION_SYCC_T81 = 0x200, T30_SUPPORT_COMPRESSION_SYCC_T81 = 0x200,
/*! T.88 monochrome JBIG2 compression */ /*! T.88 monochrome JBIG2 compression */
...@@ -382,34 +382,37 @@ enum ...@@ -382,34 +382,37 @@ enum
enum enum
{ {
/*! Support standard FAX Y-resolution 98/100dpi */ /*! Standard FAX resolution 204dpi x 98dpi - bi-level only */
T30_SUPPORT_STANDARD_RESOLUTION = 0x01, T30_SUPPORT_RESOLUTION_R8_STANDARD = 0x1,
/*! Support fine FAX Y-resolution 196/200dpi */ /*! Fine FAX resolution 204dpi x 196dpi - bi-level only */
T30_SUPPORT_FINE_RESOLUTION = 0x02, T30_SUPPORT_RESOLUTION_R8_FINE = 0x2,
/*! Support super-fine FAX Y-resolution 392/400dpi */ /*! Super-fine FAX resolution 204dpi x 391dpi - bi-level only */
T30_SUPPORT_SUPERFINE_RESOLUTION = 0x04, T30_SUPPORT_RESOLUTION_R8_SUPERFINE = 0x4,
/*! Double FAX resolution 408dpi x 391dpi - bi-level only */
/*! Support half FAX X-resolution 100/102dpi */ T30_SUPPORT_RESOLUTION_R16_SUPERFINE = 0x8,
T30_SUPPORT_R4_RESOLUTION = 0x10000,
/*! Support standard FAX X-resolution 200/204dpi */ /*! 100dpi x 100 dpi - gray scale and colour only */
T30_SUPPORT_R8_RESOLUTION = 0x20000, T30_SUPPORT_RESOLUTION_100_100 = 0x10,
/*! Support double FAX X-resolution 400dpi */ /*! 200dpi x 100 dpi - bi-level only */
T30_SUPPORT_R16_RESOLUTION = 0x40000, T30_SUPPORT_RESOLUTION_200_100 = 0x20,
/*! 200dpi x 200 dpi */
/*! Support 300dpi x 300 dpi */ T30_SUPPORT_RESOLUTION_200_200 = 0x40,
T30_SUPPORT_300_300_RESOLUTION = 0x100000, /*! 200dpi x 400 dpi - bi-level only */
/*! Support 400dpi x 400 dpi */ T30_SUPPORT_RESOLUTION_200_400 = 0x80,
T30_SUPPORT_400_400_RESOLUTION = 0x200000, /*! 300dpi x 300 dpi */
/*! Support 600dpi x 600 dpi */ T30_SUPPORT_RESOLUTION_300_300 = 0x100,
T30_SUPPORT_600_600_RESOLUTION = 0x400000, /*! 300dpi x 600 dpi - bi-level only */
/*! Support 1200dpi x 1200 dpi */ T30_SUPPORT_RESOLUTION_300_600 = 0x200,
T30_SUPPORT_1200_1200_RESOLUTION = 0x800000, /*! 400dpi x 400 dpi */
/*! Support 300dpi x 600 dpi */ T30_SUPPORT_RESOLUTION_400_400 = 0x400,
T30_SUPPORT_300_600_RESOLUTION = 0x1000000, /*! 400dpi x 800 dpi - bi-level only */
/*! Support 400dpi x 800 dpi */ T30_SUPPORT_RESOLUTION_400_800 = 0x800,
T30_SUPPORT_400_800_RESOLUTION = 0x2000000, /*! 600dpi x 600 dpi */
/*! Support 600dpi x 1200 dpi */ T30_SUPPORT_RESOLUTION_600_600 = 0x1000,
T30_SUPPORT_600_1200_RESOLUTION = 0x4000000 /*! 600dpi x 1200 dpi - bi-level only */
T30_SUPPORT_RESOLUTION_600_1200 = 0x2000,
/*! 1200dpi x 1200 dpi */
T30_SUPPORT_RESOLUTION_1200_1200 = 0x4000
}; };
enum enum
......
...@@ -65,9 +65,9 @@ typedef enum ...@@ -65,9 +65,9 @@ typedef enum
/*! T.45 run length colour compression */ /*! T.45 run length colour compression */
T4_COMPRESSION_T45 = 7, T4_COMPRESSION_T45 = 7,
/*! T.42 + T.81 + T.30 Annex E colour JPEG coding */ /*! T.42 + T.81 + T.30 Annex E colour JPEG coding */
T4_COMPRESSION_T42 = 8, T4_COMPRESSION_T42_T81 = 8,
/*! T.42 + T.81 + T.30 Annex K colour sYCC-JPEG coding */ /*! T.42 + T.81 + T.30 Annex K colour sYCC-JPEG coding */
T4_COMPRESSION_SYCC_T42 = 9 T4_COMPRESSION_SYCC_T81 = 9
} t4_image_compression_t; } t4_image_compression_t;
/*! Image type */ /*! Image type */
......
差异被折叠。
...@@ -693,20 +693,18 @@ SPAN_DECLARE(int) t30_set_supported_modems(t30_state_t *s, int supported_modems) ...@@ -693,20 +693,18 @@ SPAN_DECLARE(int) t30_set_supported_modems(t30_state_t *s, int supported_modems)
SPAN_DECLARE(int) t30_set_supported_compressions(t30_state_t *s, int supported_compressions) SPAN_DECLARE(int) t30_set_supported_compressions(t30_state_t *s, int supported_compressions)
{ {
int mask;
/* Mask out the ones we actually support today. */ /* Mask out the ones we actually support today. */
mask = T30_SUPPORT_COMPRESSION_T4_1D supported_compressions &= T30_SUPPORT_COMPRESSION_T4_1D
| T30_SUPPORT_COMPRESSION_T4_2D | T30_SUPPORT_COMPRESSION_T4_2D
| T30_SUPPORT_COMPRESSION_T6 | T30_SUPPORT_COMPRESSION_T6
//| T30_SUPPORT_COMPRESSION_T81 //| T30_SUPPORT_COMPRESSION_T81
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
| T30_SUPPORT_COMPRESSION_T43 | T30_SUPPORT_COMPRESSION_T43
#endif #endif
| T30_SUPPORT_COMPRESSION_T85 | T30_SUPPORT_COMPRESSION_T85
| T30_SUPPORT_COMPRESSION_T85_L0 | T30_SUPPORT_COMPRESSION_T85_L0
| 0; | 0;
s->supported_compressions = supported_compressions & mask; s->supported_compressions = supported_compressions;
t30_build_dis_or_dtc(s); t30_build_dis_or_dtc(s);
return 0; return 0;
} }
...@@ -714,7 +712,7 @@ SPAN_DECLARE(int) t30_set_supported_compressions(t30_state_t *s, int supported_c ...@@ -714,7 +712,7 @@ SPAN_DECLARE(int) t30_set_supported_compressions(t30_state_t *s, int supported_c
SPAN_DECLARE(int) t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions) SPAN_DECLARE(int) t30_set_supported_resolutions(t30_state_t *s, int supported_resolutions)
{ {
s->supported_resolutions = supported_resolutions; s->supported_bilevel_resolutions = supported_resolutions;
t30_build_dis_or_dtc(s); t30_build_dis_or_dtc(s);
return 0; return 0;
} }
......
...@@ -97,18 +97,18 @@ SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding) ...@@ -97,18 +97,18 @@ SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding)
return "T.4 2-D"; return "T.4 2-D";
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return "T.6"; return "T.6";
case T4_COMPRESSION_T42:
return "T.42";
case T4_COMPRESSION_SYCC_T42:
return "sYCC T.42";
case T4_COMPRESSION_T43:
return "T.43";
case T4_COMPRESSION_T45:
return "T.45";
case T4_COMPRESSION_T85: case T4_COMPRESSION_T85:
return "T.85"; return "T.85";
case T4_COMPRESSION_T85_L0: case T4_COMPRESSION_T85_L0:
return "T.85(L0)"; return "T.85(L0)";
case T4_COMPRESSION_T42_T81:
return "T.81";
case T4_COMPRESSION_SYCC_T81:
return "sYCC T.81";
case T4_COMPRESSION_T43:
return "T.43";
case T4_COMPRESSION_T45:
return "T.45";
} }
return "???"; return "???";
} }
...@@ -171,7 +171,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s) ...@@ -171,7 +171,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
output_compression = COMPRESSION_CCITT_T6; output_compression = COMPRESSION_CCITT_T6;
break; break;
#if defined(SPANDSP_SUPPORT_T42) #if defined(SPANDSP_SUPPORT_T42)
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
output_compression = COMPRESSION_JPEG; output_compression = COMPRESSION_JPEG;
bits_per_sample = 8; bits_per_sample = 8;
samples_per_pixel = 3; samples_per_pixel = 3;
...@@ -299,7 +299,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s) ...@@ -299,7 +299,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
image_length = t4_t6_decode_get_image_length(&s->decoder.t4_t6); image_length = t4_t6_decode_get_image_length(&s->decoder.t4_t6);
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
image_length = t42_decode_get_image_length(&s->decoder.t42); image_length = t42_decode_get_image_length(&s->decoder.t42);
break; break;
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
...@@ -454,7 +454,7 @@ SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len) ...@@ -454,7 +454,7 @@ SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len)
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_decode_put(&s->decoder.t4_t6, buf, len); return t4_t6_decode_put(&s->decoder.t4_t6, buf, len);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_decode_put(&s->decoder.t42, buf, len); return t42_decode_put(&s->decoder.t42, buf, len);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
...@@ -529,10 +529,10 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int encoding) ...@@ -529,10 +529,10 @@ SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int encoding)
} }
s->line_encoding = encoding; s->line_encoding = encoding;
return t4_t6_decode_set_encoding(&s->decoder.t4_t6, encoding); return t4_t6_decode_set_encoding(&s->decoder.t4_t6, encoding);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
switch (s->line_encoding) switch (s->line_encoding)
{ {
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
break; break;
default: default:
t42_decode_init(&s->decoder.t42, s->row_handler, s->row_handler_user_data); t42_decode_init(&s->decoder.t42, s->row_handler, s->row_handler_user_data);
...@@ -599,7 +599,7 @@ SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_han ...@@ -599,7 +599,7 @@ SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_han
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_decode_set_row_write_handler(&s->decoder.t4_t6, handler, user_data); return t4_t6_decode_set_row_write_handler(&s->decoder.t4_t6, handler, user_data);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_decode_set_row_write_handler(&s->decoder.t42, handler, user_data); return t42_decode_set_row_write_handler(&s->decoder.t42, handler, user_data);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
...@@ -638,7 +638,7 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t ...@@ -638,7 +638,7 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
t->bad_rows = s->decoder.t4_t6.bad_rows; t->bad_rows = s->decoder.t4_t6.bad_rows;
t->longest_bad_row_run = s->decoder.t4_t6.longest_bad_row_run; t->longest_bad_row_run = s->decoder.t4_t6.longest_bad_row_run;
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t->type = 0; t->type = 0;
t->width = t42_decode_get_image_width(&s->decoder.t42); t->width = t42_decode_get_image_width(&s->decoder.t42);
t->length = t42_decode_get_image_length(&s->decoder.t42); t->length = t42_decode_get_image_length(&s->decoder.t42);
...@@ -683,7 +683,7 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s) ...@@ -683,7 +683,7 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
t4_t6_decode_restart(&s->decoder.t4_t6, s->image_width); t4_t6_decode_restart(&s->decoder.t4_t6, s->image_width);
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t42_decode_restart(&s->decoder.t42); t42_decode_restart(&s->decoder.t42);
break; break;
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
...@@ -740,7 +740,7 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s) ...@@ -740,7 +740,7 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
t4_t6_decode_put(&s->decoder.t4_t6, NULL, 0); t4_t6_decode_put(&s->decoder.t4_t6, NULL, 0);
length = t4_t6_decode_get_image_length(&s->decoder.t4_t6); length = t4_t6_decode_get_image_length(&s->decoder.t4_t6);
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t42_decode_put(&s->decoder.t42, NULL, 0); t42_decode_put(&s->decoder.t42, NULL, 0);
length = t42_decode_get_image_length(&s->decoder.t42); length = t42_decode_get_image_length(&s->decoder.t42);
break; break;
...@@ -840,7 +840,7 @@ SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s) ...@@ -840,7 +840,7 @@ SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s)
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_decode_release(&s->decoder.t4_t6); return t4_t6_decode_release(&s->decoder.t4_t6);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_decode_release(&s->decoder.t42); return t42_decode_release(&s->decoder.t42);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
......
...@@ -642,7 +642,7 @@ static int set_row_read_handler(t4_tx_state_t *s, t4_row_read_handler_t handler, ...@@ -642,7 +642,7 @@ static int set_row_read_handler(t4_tx_state_t *s, t4_row_read_handler_t handler,
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_encode_set_row_read_handler(&s->encoder.t4_t6, handler, user_data); return t4_t6_encode_set_row_read_handler(&s->encoder.t4_t6, handler, user_data);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_encode_set_row_read_handler(&s->encoder.t42, handler, user_data); return t42_encode_set_row_read_handler(&s->encoder.t42, handler, user_data);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
...@@ -812,10 +812,10 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding) ...@@ -812,10 +812,10 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
} }
s->line_encoding = encoding; s->line_encoding = encoding;
return t4_t6_encode_set_encoding(&s->encoder.t4_t6, encoding); return t4_t6_encode_set_encoding(&s->encoder.t4_t6, encoding);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
switch (s->line_encoding) switch (s->line_encoding)
{ {
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
break; break;
default: default:
t42_encode_init(&s->encoder.t42, s->image_width, s->image_length, s->row_handler, s->row_handler_user_data); t42_encode_init(&s->encoder.t42, s->image_width, s->image_length, s->row_handler, s->row_handler_user_data);
...@@ -877,7 +877,7 @@ SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width) ...@@ -877,7 +877,7 @@ SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width)
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
t4_t6_encode_set_image_width(&s->encoder.t4_t6, image_width); t4_t6_encode_set_image_width(&s->encoder.t4_t6, image_width);
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t42_encode_set_image_width(&s->encoder.t42, image_width); t42_encode_set_image_width(&s->encoder.t42, image_width);
break; break;
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
...@@ -898,7 +898,7 @@ static void t4_tx_set_image_length(t4_tx_state_t *s, int image_length) ...@@ -898,7 +898,7 @@ static void t4_tx_set_image_length(t4_tx_state_t *s, int image_length)
s->image_length = image_length; s->image_length = image_length;
switch (s->line_encoding) switch (s->line_encoding)
{ {
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t42_encode_set_image_length(&s->encoder.t42, image_length); t42_encode_set_image_length(&s->encoder.t42, image_length);
break; break;
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
...@@ -1014,7 +1014,7 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t ...@@ -1014,7 +1014,7 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t
t->length = t4_t6_encode_get_image_length(&s->encoder.t4_t6)/s->row_squashing_ratio; t->length = t4_t6_encode_get_image_length(&s->encoder.t4_t6)/s->row_squashing_ratio;
t->line_image_size = t4_t6_encode_get_compressed_image_size(&s->encoder.t4_t6)/8; t->line_image_size = t4_t6_encode_get_compressed_image_size(&s->encoder.t4_t6)/8;
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t->type = 0; t->type = 0;
t->width = t42_encode_get_image_width(&s->encoder.t42); t->width = t42_encode_get_image_width(&s->encoder.t42);
t->length = t42_encode_get_image_length(&s->encoder.t42)/s->row_squashing_ratio; t->length = t42_encode_get_image_length(&s->encoder.t42)/s->row_squashing_ratio;
...@@ -1047,7 +1047,7 @@ SPAN_DECLARE(int) t4_tx_image_complete(t4_tx_state_t *s) ...@@ -1047,7 +1047,7 @@ SPAN_DECLARE(int) t4_tx_image_complete(t4_tx_state_t *s)
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_encode_image_complete(&s->encoder.t4_t6); return t4_t6_encode_image_complete(&s->encoder.t4_t6);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_encode_image_complete(&s->encoder.t42); return t42_encode_image_complete(&s->encoder.t42);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
...@@ -1076,7 +1076,7 @@ SPAN_DECLARE(int) t4_tx_get(t4_tx_state_t *s, uint8_t buf[], size_t max_len) ...@@ -1076,7 +1076,7 @@ SPAN_DECLARE(int) t4_tx_get(t4_tx_state_t *s, uint8_t buf[], size_t max_len)
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_encode_get(&s->encoder.t4_t6, buf, max_len); return t4_t6_encode_get(&s->encoder.t4_t6, buf, max_len);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_encode_get(&s->encoder.t42, buf, max_len); return t42_encode_get(&s->encoder.t42, buf, max_len);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
...@@ -1115,7 +1115,7 @@ SPAN_DECLARE(int) t4_tx_start_page(t4_tx_state_t *s) ...@@ -1115,7 +1115,7 @@ SPAN_DECLARE(int) t4_tx_start_page(t4_tx_state_t *s)
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
t4_t6_encode_restart(&s->encoder.t4_t6, s->image_width); t4_t6_encode_restart(&s->encoder.t4_t6, s->image_width);
break; break;
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
t42_encode_restart(&s->encoder.t42, s->image_width, s->image_length); t42_encode_restart(&s->encoder.t42, s->image_width, s->image_length);
break; break;
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
...@@ -1237,7 +1237,7 @@ SPAN_DECLARE(int) t4_tx_release(t4_tx_state_t *s) ...@@ -1237,7 +1237,7 @@ SPAN_DECLARE(int) t4_tx_release(t4_tx_state_t *s)
case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T4_2D:
case T4_COMPRESSION_T6: case T4_COMPRESSION_T6:
return t4_t6_encode_release(&s->encoder.t4_t6); return t4_t6_encode_release(&s->encoder.t4_t6);
case T4_COMPRESSION_T42: case T4_COMPRESSION_T42_T81:
return t42_encode_release(&s->encoder.t42); return t42_encode_release(&s->encoder.t42);
#if defined(SPANDSP_SUPPORT_T43) #if defined(SPANDSP_SUPPORT_T43)
case T4_COMPRESSION_T43: case T4_COMPRESSION_T43:
......
...@@ -629,35 +629,64 @@ SPAN_DECLARE(uint8_t) v18_decode_baudot(v18_state_t *s, uint8_t ch) ...@@ -629,35 +629,64 @@ SPAN_DECLARE(uint8_t) v18_decode_baudot(v18_state_t *s, uint8_t ch)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static void v18_rx_dtmf(void *user_data, const char digits[], int len) static int v18_tdd_get_async_byte(void *user_data)
{ {
#if 0
v18_state_t *s; v18_state_t *s;
int ch;
unsigned int x;
s = (v18_state_t *) user_data; s = (v18_state_t *) user_data;
#endif
if (s->next_byte != 0xFF)
{
s->rx_suppression = (300*SAMPLE_RATE)/1000;
x = s->next_byte;
s->next_byte = (uint8_t) 0xFF;
return x;
}
if ((ch = queue_read_byte(&s->queue.queue)) >= 0)
return ch;
if (s->tx_signal_on)
{
/* The FSK should now be switched off. */
s->tx_signal_on = FALSE;
}
return 0x1F;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static int v18_tdd_get_async_byte(void *user_data) static void v18_dtmf_get(void *user_data)
{ {
v18_state_t *s; v18_state_t *s;
int ch; int ch;
const char *v;
s = (v18_state_t *) user_data; s = (v18_state_t *) user_data;
if ((ch = queue_read_byte(&s->queue.queue)) >= 0) if ((ch = queue_read_byte(&s->queue.queue)) >= 0)
return ch;
if (s->tx_signal_on)
{ {
/* The FSK should now be switched off. */ v = ascii_to_dtmf[ch & 0x7F];
s->tx_signal_on = FALSE; dtmf_tx_put(&s->dtmftx, v, strlen(v));
s->rx_suppression = ((300 + 100*strlen(v))*SAMPLE_RATE)/1000;
} }
return 0x1F;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static int v18_edt_get_async_byte(void *user_data) static int v18_edt_get_async_byte(void *user_data)
{ {
v18_state_t *s;
int ch;
s = (v18_state_t *) user_data;
if ((ch = queue_read_byte(&s->queue.queue)) >= 0)
{
s->rx_suppression = (300*SAMPLE_RATE)/1000;
return ch;
}
if (s->tx_signal_on)
{
/* The FSK should now be switched off. */
s->tx_signal_on = FALSE;
}
return 0; return 0;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
...@@ -709,23 +738,62 @@ static void v18_tdd_put_async_byte(void *user_data, int byte) ...@@ -709,23 +738,62 @@ static void v18_tdd_put_async_byte(void *user_data, int byte)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static void v18_dtmf_put(void *user_data, const char dtmf[], int len)
{
v18_state_t *s;
char buf[128];
int i;
s = (v18_state_t *) user_data;
if (s->rx_suppression > 0)
return;
for (i = 0; i < len; i++)
{
s->rx_msg[s->rx_msg_len++] = dtmf[i];
if (dtmf[i] >= '0' && dtmf[i] <= '9')
{
s->rx_msg[s->rx_msg_len] = '\0';
if (v18_decode_dtmf(s, buf, (const char *) s->rx_msg) > 0)
s->put_msg(s->user_data, (const uint8_t *) buf, 1);
s->rx_msg_len = 0;
}
}
}
/*- End of function --------------------------------------------------------*/
static void v18_edt_put_async_byte(void *user_data, int byte) static void v18_edt_put_async_byte(void *user_data, int byte)
{ {
v18_state_t *s;
s = (v18_state_t *) user_data;
if (s->rx_suppression > 0)
return;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static void v18_bell103_put_async_byte(void *user_data, int byte) static void v18_bell103_put_async_byte(void *user_data, int byte)
{ {
v18_state_t *s;
s = (v18_state_t *) user_data;
if (s->rx_suppression > 0)
return;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static void v18_videotex_put_async_byte(void *user_data, int byte) static void v18_videotex_put_async_byte(void *user_data, int byte)
{ {
v18_state_t *s;
s = (v18_state_t *) user_data;
if (s->rx_suppression > 0)
return;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
static void v18_textphone_put_async_byte(void *user_data, int byte) static void v18_textphone_put_async_byte(void *user_data, int byte)
{ {
v18_state_t *s;
s = (v18_state_t *) user_data;
if (s->rx_suppression > 0)
return;
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
...@@ -759,6 +827,13 @@ SPAN_DECLARE_NONSTD(int) v18_tx(v18_state_t *s, int16_t *amp, int max_len) ...@@ -759,6 +827,13 @@ SPAN_DECLARE_NONSTD(int) v18_tx(v18_state_t *s, int16_t *amp, int max_len)
SPAN_DECLARE_NONSTD(int) v18_rx(v18_state_t *s, const int16_t amp[], int len) SPAN_DECLARE_NONSTD(int) v18_rx(v18_state_t *s, const int16_t amp[], int len)
{ {
if (s->rx_suppression > 0)
{
if (s->rx_suppression > len)
s->rx_suppression -= len;
else
s->rx_suppression = 0;
}
switch (s->mode) switch (s->mode)
{ {
case V18_MODE_DTMF: case V18_MODE_DTMF:
...@@ -776,6 +851,32 @@ SPAN_DECLARE_NONSTD(int) v18_rx(v18_state_t *s, const int16_t amp[], int len) ...@@ -776,6 +851,32 @@ SPAN_DECLARE_NONSTD(int) v18_rx(v18_state_t *s, const int16_t amp[], int len)
} }
/*- End of function --------------------------------------------------------*/ /*- End of function --------------------------------------------------------*/
SPAN_DECLARE_NONSTD(int) v18_rx_fillin(v18_state_t *s, int len)
{
if (s->rx_suppression > 0)
{
if (s->rx_suppression > len)
s->rx_suppression -= len;
else
s->rx_suppression = 0;
}
switch (s->mode)
{
case V18_MODE_DTMF:
/* Apply a message timeout. */
//s->in_progress -= len;
//if (s->in_progress <= 0)
// s->rx_msg_len = 0;
dtmf_rx_fillin(&s->dtmfrx, len);
break;
default:
fsk_rx_fillin(&s->fskrx, len);
break;
}
return 0;
}
/*- End of function --------------------------------------------------------*/
SPAN_DECLARE(int) v18_put(v18_state_t *s, const char msg[], int len) SPAN_DECLARE(int) v18_put(v18_state_t *s, const char msg[], int len)
{ {
char buf[256 + 1]; char buf[256 + 1];
...@@ -819,7 +920,7 @@ SPAN_DECLARE(int) v18_put(v18_state_t *s, const char msg[], int len) ...@@ -819,7 +920,7 @@ SPAN_DECLARE(int) v18_put(v18_state_t *s, const char msg[], int len)
SPAN_DECLARE(const char *) v18_mode_to_str(int mode) SPAN_DECLARE(const char *) v18_mode_to_str(int mode)
{ {
switch (mode & 0xFF) switch ((mode & 0xFF))
{ {
case V18_MODE_NONE: case V18_MODE_NONE:
return "None"; return "None";
...@@ -870,6 +971,7 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s, ...@@ -870,6 +971,7 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
switch (s->mode) switch (s->mode)
{ {
case V18_MODE_5BIT_45: case V18_MODE_5BIT_45:
s->repeat_shifts = mode & 0x100;
fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_WEITBRECHT], async_tx_get_bit, &s->asynctx); fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_WEITBRECHT], async_tx_get_bit, &s->asynctx);
async_tx_init(&s->asynctx, 5, ASYNC_PARITY_NONE, 2, FALSE, v18_tdd_get_async_byte, s); async_tx_init(&s->asynctx, 5, ASYNC_PARITY_NONE, 2, FALSE, v18_tdd_get_async_byte, s);
/* Schedule an explicit shift at the start of baudot transmission */ /* Schedule an explicit shift at the start of baudot transmission */
...@@ -878,9 +980,10 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s, ...@@ -878,9 +980,10 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
ride over the fraction. */ ride over the fraction. */
fsk_rx_init(&s->fskrx, &preset_fsk_specs[FSK_WEITBRECHT], FSK_FRAME_MODE_5N1_FRAMES, v18_tdd_put_async_byte, s); fsk_rx_init(&s->fskrx, &preset_fsk_specs[FSK_WEITBRECHT], FSK_FRAME_MODE_5N1_FRAMES, v18_tdd_put_async_byte, s);
s->baudot_rx_shift = 0; s->baudot_rx_shift = 0;
s->repeat_shifts = mode & 0x100; s->next_byte = (uint8_t) 0xFF;
break; break;
case V18_MODE_5BIT_50: case V18_MODE_5BIT_50:
s->repeat_shifts = mode & 0x100;
fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_WEITBRECHT50], async_tx_get_bit, &s->asynctx); fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_WEITBRECHT50], async_tx_get_bit, &s->asynctx);
async_tx_init(&s->asynctx, 5, ASYNC_PARITY_NONE, 2, FALSE, v18_tdd_get_async_byte, s); async_tx_init(&s->asynctx, 5, ASYNC_PARITY_NONE, 2, FALSE, v18_tdd_get_async_byte, s);
/* Schedule an explicit shift at the start of baudot transmission */ /* Schedule an explicit shift at the start of baudot transmission */
...@@ -889,11 +992,11 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s, ...@@ -889,11 +992,11 @@ SPAN_DECLARE(v18_state_t *) v18_init(v18_state_t *s,
ride over the fraction. */ ride over the fraction. */
fsk_rx_init(&s->fskrx, &preset_fsk_specs[FSK_WEITBRECHT50], FSK_FRAME_MODE_5N1_FRAMES, v18_tdd_put_async_byte, s); fsk_rx_init(&s->fskrx, &preset_fsk_specs[FSK_WEITBRECHT50], FSK_FRAME_MODE_5N1_FRAMES, v18_tdd_put_async_byte, s);
s->baudot_rx_shift = 0; s->baudot_rx_shift = 0;
s->repeat_shifts = mode & 0x100; s->next_byte = (uint8_t) 0xFF;
break; break;
case V18_MODE_DTMF: case V18_MODE_DTMF:
dtmf_tx_init(&s->dtmftx, NULL, NULL); dtmf_tx_init(&s->dtmftx, v18_dtmf_get, s);
dtmf_rx_init(&s->dtmfrx, v18_rx_dtmf, s); dtmf_rx_init(&s->dtmfrx, v18_dtmf_put, s);
break; break;
case V18_MODE_EDT: case V18_MODE_EDT:
fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_V21CH1_110], async_tx_get_bit, &s->asynctx); fsk_tx_init(&s->fsktx, &preset_fsk_specs[FSK_V21CH1_110], async_tx_get_bit, &s->asynctx);
......
...@@ -108,7 +108,7 @@ int main(int argc, char *argv[]) ...@@ -108,7 +108,7 @@ int main(int argc, char *argv[])
image_size = IMAGE_WIDTH*ROWS_PER_STRIPE/8; image_size = IMAGE_WIDTH*ROWS_PER_STRIPE/8;
memset(image_buffer, 0x18, image_size); memset(image_buffer, 0x18, image_size);
for (i = 0; i < IMAGE_LENGTH/ROWS_PER_STRIPE; i++) for (i = 0; i*ROWS_PER_STRIPE < IMAGE_LENGTH; i++)
{ {
if (IMAGE_LENGTH > (i + 1)*ROWS_PER_STRIPE) if (IMAGE_LENGTH > (i + 1)*ROWS_PER_STRIPE)
image_size = IMAGE_WIDTH*ROWS_PER_STRIPE/8; image_size = IMAGE_WIDTH*ROWS_PER_STRIPE/8;
......
...@@ -59,6 +59,7 @@ int v14_test_async_tx_get_bit(void *user_data) ...@@ -59,6 +59,7 @@ int v14_test_async_tx_get_bit(void *user_data)
{ {
async_tx_state_t *s; async_tx_state_t *s;
int bit; int bit;
int parity_bit;
static int destuff = 0; static int destuff = 0;
/* Special routine to test V.14 rate adaption, by randomly skipping /* Special routine to test V.14 rate adaption, by randomly skipping
...@@ -66,42 +67,39 @@ int v14_test_async_tx_get_bit(void *user_data) ...@@ -66,42 +67,39 @@ int v14_test_async_tx_get_bit(void *user_data)
s = (async_tx_state_t *) user_data; s = (async_tx_state_t *) user_data;
if (s->bitpos == 0) if (s->bitpos == 0)
{ {
s->byte_in_progress = s->get_byte(s->user_data);
s->byte_in_progress &= (0xFFFF >> (16 - s->data_bits));
if (s->parity)
{
parity_bit = parity8(s->byte_in_progress);
if (s->parity == ASYNC_PARITY_ODD)
parity_bit ^= 1;
s->byte_in_progress |= (parity_bit << s->data_bits);
s->byte_in_progress |= (0xFFFF << (s->data_bits + 1));
}
else
{
s->byte_in_progress |= (0xFFFF << s->data_bits);
}
/* Start bit */ /* Start bit */
bit = 0; bit = 0;
s->byte_in_progress = s->get_byte(s->user_data);
s->parity_bit = 0;
s->bitpos++; s->bitpos++;
} }
else if (s->bitpos <= s->data_bits) else
{ {
bit = s->byte_in_progress & 1; bit = s->byte_in_progress & 1;
s->byte_in_progress >>= 1; s->byte_in_progress >>= 1;
s->parity_bit ^= bit; /* Drop the stop bit on every fourth character for V.14 simulation */
s->bitpos++; if ((++destuff & 3) == 0)
if (!s->parity && s->bitpos == s->data_bits + 1)
{ {
/* Drop the stop bit on every fourth character for V.14 simulation*/ if (++s->bitpos > s->total_bits - 1)
if ((++destuff & 3) == 0) s->bitpos = 0;
}
else
{
if (++s->bitpos > s->total_bits)
s->bitpos = 0; s->bitpos = 0;
} }
}
else if (s->parity && s->bitpos == s->data_bits + 1)
{
if (s->parity == ASYNC_PARITY_ODD)
s->parity_bit ^= 1;
bit = s->parity_bit;
s->bitpos++;
/* Drop the stop bit on every fourth character for V.14 simulation */
if ((++destuff & 3) == 0)
s->bitpos = 0;
}
else
{
/* Stop bit(s) */
bit = 1;
s->bitpos++;
if (s->bitpos > s->data_bits + s->stop_bits)
s->bitpos = 0;
} }
return bit; return bit;
} }
...@@ -207,7 +205,7 @@ int main(int argc, char *argv[]) ...@@ -207,7 +205,7 @@ int main(int argc, char *argv[])
async_rx_put_bit(&rx_async, bit); async_rx_put_bit(&rx_async, bit);
} }
printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors); printf("Chars=%d/%d, PE=%d, FE=%d\n", tx_async_chars, rx_async_chars, rx_async.parity_errors, rx_async.framing_errors);
if (tx_async_chars != rx_async_chars + 1 if (tx_async_chars != rx_async_chars
|| ||
rx_async.parity_errors rx_async.parity_errors
|| ||
......
...@@ -846,18 +846,20 @@ int main(int argc, char *argv[]) ...@@ -846,18 +846,20 @@ int main(int argc, char *argv[])
| T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_255MM_WIDTH
| T30_SUPPORT_303MM_WIDTH); | T30_SUPPORT_303MM_WIDTH);
t30_set_supported_resolutions(t30_state[i], t30_set_supported_resolutions(t30_state[i],
T30_SUPPORT_STANDARD_RESOLUTION T30_SUPPORT_RESOLUTION_R8_STANDARD
| T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_RESOLUTION_R8_FINE
| T30_SUPPORT_SUPERFINE_RESOLUTION | T30_SUPPORT_RESOLUTION_R8_SUPERFINE
| T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_RESOLUTION_R16_SUPERFINE
| T30_SUPPORT_R16_RESOLUTION | T30_SUPPORT_RESOLUTION_200_100
| T30_SUPPORT_300_300_RESOLUTION | T30_SUPPORT_RESOLUTION_200_200
| T30_SUPPORT_400_400_RESOLUTION | T30_SUPPORT_RESOLUTION_200_400
| T30_SUPPORT_600_600_RESOLUTION | T30_SUPPORT_RESOLUTION_300_300
| T30_SUPPORT_1200_1200_RESOLUTION | T30_SUPPORT_RESOLUTION_300_600
| T30_SUPPORT_300_600_RESOLUTION | T30_SUPPORT_RESOLUTION_400_400
| T30_SUPPORT_400_800_RESOLUTION | T30_SUPPORT_RESOLUTION_400_800
| T30_SUPPORT_600_1200_RESOLUTION); | T30_SUPPORT_RESOLUTION_600_600
| T30_SUPPORT_RESOLUTION_600_1200
| T30_SUPPORT_RESOLUTION_1200_1200);
//t30_set_rx_encoding(t30_state[i], T4_COMPRESSION_T85); //t30_set_rx_encoding(t30_state[i], T4_COMPRESSION_T85);
t30_set_ecm_capability(t30_state[i], use_ecm); t30_set_ecm_capability(t30_state[i], use_ecm);
if (use_ecm) if (use_ecm)
......
...@@ -43,6 +43,19 @@ ITUTESTS_DIR=../test-data/itu/fax ...@@ -43,6 +43,19 @@ ITUTESTS_DIR=../test-data/itu/fax
for OPTS in "-p AA" "-p AA -e" "-p TT" "-p TT -e" "-p GG" "-p GG -e" "-p TG" "-p TG -e" "-p GT" "-p GT -e" for OPTS in "-p AA" "-p AA -e" "-p TT" "-p TT -e" "-p GG" "-p GG -e" "-p TG" "-p TG -e" "-p GT" "-p GT -e"
do do
FILE="${ITUTESTS_DIR}/itutests.tif"
run_fax_test
FILE="${ITUTESTS_DIR}/100pages.tif"
run_fax_test
FILE="${ITUTESTS_DIR}/striped.tif"
run_fax_test
FILE="${ITUTESTS_DIR}/mixed_size_pages.tif"
run_fax_test
FILE="${ITUTESTS_DIR}/bilevel_R8_385_A4.tif" FILE="${ITUTESTS_DIR}/bilevel_R8_385_A4.tif"
run_fax_test run_fax_test
......
...@@ -393,18 +393,20 @@ static void fax_prepare(void) ...@@ -393,18 +393,20 @@ static void fax_prepare(void)
| T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_255MM_WIDTH
| T30_SUPPORT_303MM_WIDTH); | T30_SUPPORT_303MM_WIDTH);
t30_set_supported_resolutions(t30, t30_set_supported_resolutions(t30,
T30_SUPPORT_STANDARD_RESOLUTION T30_SUPPORT_RESOLUTION_R8_STANDARD
| T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_RESOLUTION_R8_FINE
| T30_SUPPORT_SUPERFINE_RESOLUTION | T30_SUPPORT_RESOLUTION_R8_SUPERFINE
| T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_RESOLUTION_R16_SUPERFINE
| T30_SUPPORT_R16_RESOLUTION | T30_SUPPORT_RESOLUTION_200_100
| T30_SUPPORT_300_300_RESOLUTION | T30_SUPPORT_RESOLUTION_200_200
| T30_SUPPORT_400_400_RESOLUTION | T30_SUPPORT_RESOLUTION_200_400
| T30_SUPPORT_600_600_RESOLUTION | T30_SUPPORT_RESOLUTION_300_300
| T30_SUPPORT_1200_1200_RESOLUTION | T30_SUPPORT_RESOLUTION_300_600
| T30_SUPPORT_300_600_RESOLUTION | T30_SUPPORT_RESOLUTION_400_400
| T30_SUPPORT_400_800_RESOLUTION | T30_SUPPORT_RESOLUTION_400_800
| T30_SUPPORT_600_1200_RESOLUTION); | T30_SUPPORT_RESOLUTION_600_600
| T30_SUPPORT_RESOLUTION_600_1200
| T30_SUPPORT_RESOLUTION_1200_1200);
t30_set_supported_modems(t30, T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17); t30_set_supported_modems(t30, T30_SUPPORT_V27TER | T30_SUPPORT_V29 | T30_SUPPORT_V17);
t30_set_supported_compressions(t30, T30_SUPPORT_COMPRESSION_T4_1D | T30_SUPPORT_COMPRESSION_T4_2D | T30_SUPPORT_COMPRESSION_T6); t30_set_supported_compressions(t30, T30_SUPPORT_COMPRESSION_T4_1D | T30_SUPPORT_COMPRESSION_T4_2D | T30_SUPPORT_COMPRESSION_T6);
t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A'); t30_set_phase_b_handler(t30, phase_b_handler, (void *) (intptr_t) 'A');
......
...@@ -876,8 +876,8 @@ static switch_status_t spanfax_init(pvt_t *pvt, transport_mode_t trans_mode) ...@@ -876,8 +876,8 @@ static switch_status_t spanfax_init(pvt_t *pvt, transport_mode_t trans_mode)
T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH T30_SUPPORT_US_LETTER_LENGTH | T30_SUPPORT_US_LEGAL_LENGTH | T30_SUPPORT_UNLIMITED_LENGTH
| T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH); | T30_SUPPORT_215MM_WIDTH | T30_SUPPORT_255MM_WIDTH | T30_SUPPORT_303MM_WIDTH);
t30_set_supported_resolutions(t30, t30_set_supported_resolutions(t30,
T30_SUPPORT_STANDARD_RESOLUTION | T30_SUPPORT_FINE_RESOLUTION | T30_SUPPORT_SUPERFINE_RESOLUTION T30_SUPPORT_RESOLUTION_R8_STANDARD | T30_SUPPORT_RESOLUTION_R8_FINE | T30_SUPPORT_RESOLUTION_R8_SUPERFINE
| T30_SUPPORT_R8_RESOLUTION | T30_SUPPORT_R16_RESOLUTION); | T30_SUPPORT_RESOLUTION_R16_SUPERFINE);
if (pvt->disable_v17) { if (pvt->disable_v17) {
t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER); t30_set_supported_modems(t30, T30_SUPPORT_V29 | T30_SUPPORT_V27TER);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论