mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-17 09:12:25 +00:00
Tweaks to spandsp
This commit is contained in:
parent
abcf4ac7e6
commit
c1e5175290
@ -435,7 +435,6 @@ static void decode_20digit_msg(t30_state_t *s, char *msg, const uint8_t *pkt, in
|
|||||||
static void decode_url_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len);
|
static void decode_url_msg(t30_state_t *s, char *msg, const uint8_t *pkt, int len);
|
||||||
static int decode_nsf_nss_nsc(t30_state_t *s, uint8_t *msg[], const uint8_t *pkt, int len);
|
static int decode_nsf_nss_nsc(t30_state_t *s, uint8_t *msg[], const uint8_t *pkt, int len);
|
||||||
static void set_min_scan_time(t30_state_t *s);
|
static void set_min_scan_time(t30_state_t *s);
|
||||||
static int send_cfr_sequence(t30_state_t *s, int start);
|
|
||||||
static void timer_t2_start(t30_state_t *s);
|
static void timer_t2_start(t30_state_t *s);
|
||||||
static void timer_t2a_start(t30_state_t *s);
|
static void timer_t2a_start(t30_state_t *s);
|
||||||
static void timer_t2b_start(t30_state_t *s);
|
static void timer_t2b_start(t30_state_t *s);
|
||||||
@ -1217,6 +1216,15 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T85_L0_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T85_L0_CAPABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T88))
|
||||||
|
//{
|
||||||
|
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_1);
|
||||||
|
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_2);
|
||||||
|
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_3);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//if ((s->supported_compressions & (T4_SUPPORT_COMPRESSION_COLOUR | T4_SUPPORT_COMPRESSION_GRAYSCALE)))
|
||||||
|
{
|
||||||
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_COLOUR))
|
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_COLOUR))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_FULL_COLOUR_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_FULL_COLOUR_CAPABLE);
|
||||||
|
|
||||||
@ -1225,8 +1233,9 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T43))
|
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T43))
|
||||||
{
|
{
|
||||||
/* Note 25 of table 2/T.30 */
|
/* Note 25 of table 2/T.30 */
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T43_CAPABLE);
|
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T81_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T81_CAPABLE);
|
||||||
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T43_CAPABLE);
|
||||||
|
/* No plane interleave */
|
||||||
}
|
}
|
||||||
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T45))
|
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T45))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T45_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T45_CAPABLE);
|
||||||
@ -1235,12 +1244,6 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T81_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T81_CAPABLE);
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_SYCC_T81_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_SYCC_T81_CAPABLE);
|
||||||
}
|
}
|
||||||
//if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_T88))
|
|
||||||
//{
|
|
||||||
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_1);
|
|
||||||
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_2);
|
|
||||||
// set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_T88_CAPABILITY_3);
|
|
||||||
//}
|
|
||||||
|
|
||||||
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_12BIT))
|
if ((s->supported_compressions & T4_SUPPORT_COMPRESSION_12BIT))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_12BIT_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_12BIT_CAPABLE);
|
||||||
@ -1251,18 +1254,13 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
/* No custom illuminant */
|
/* No custom illuminant */
|
||||||
/* No custom gamut range */
|
/* No custom gamut range */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_FIELD_NOT_VALID))
|
if ((s->supported_t30_features & T30_SUPPORT_FIELD_NOT_VALID))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_FNV_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_FNV_CAPABLE);
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_MULTIPLE_SELECTIVE_POLLING))
|
if ((s->supported_t30_features & T30_SUPPORT_MULTIPLE_SELECTIVE_POLLING))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_MULTIPLE_SELECTIVE_POLLING_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_MULTIPLE_SELECTIVE_POLLING_CAPABLE);
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_POLLED_SUB_ADDRESSING))
|
if ((s->supported_t30_features & T30_SUPPORT_POLLED_SUB_ADDRESSING))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_POLLED_SUBADDRESSING_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_POLLED_SUBADDRESSING_CAPABLE);
|
||||||
|
|
||||||
/* No plane interleave */
|
|
||||||
/* No G.726 */
|
|
||||||
/* No extended voice coding */
|
|
||||||
/* Superfine minimum scan line time pattern follows fine */
|
|
||||||
|
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_SELECTIVE_POLLING))
|
if ((s->supported_t30_features & T30_SUPPORT_SELECTIVE_POLLING))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_SELECTIVE_POLLING_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_SELECTIVE_POLLING_CAPABLE);
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_SUB_ADDRESSING))
|
if ((s->supported_t30_features & T30_SUPPORT_SUB_ADDRESSING))
|
||||||
@ -1270,10 +1268,16 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
if ((s->supported_t30_features & T30_SUPPORT_IDENTIFICATION))
|
if ((s->supported_t30_features & T30_SUPPORT_IDENTIFICATION))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_PASSWORD);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_PASSWORD);
|
||||||
|
|
||||||
|
/* No G.726 */
|
||||||
|
/* No extended voice coding */
|
||||||
|
/* Superfine minimum scan line time pattern follows fine */
|
||||||
|
|
||||||
/* Ready to transmit a data file (polling) */
|
/* Ready to transmit a data file (polling) */
|
||||||
if (s->tx_file[0])
|
if (s->tx_file[0])
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_READY_TO_TRANSMIT_DATA_FILE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_READY_TO_TRANSMIT_DATA_FILE);
|
||||||
|
|
||||||
|
/* No simple phase C BFT negotiations */
|
||||||
|
/* No extended BFT negotiations */
|
||||||
/* No Binary file transfer (BFT) */
|
/* No Binary file transfer (BFT) */
|
||||||
/* No Document transfer mode (DTM) */
|
/* No Document transfer mode (DTM) */
|
||||||
/* No Electronic data interchange (EDI) */
|
/* No Electronic data interchange (EDI) */
|
||||||
@ -1295,11 +1299,9 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
/* No HFX40-I hashing */
|
/* No HFX40-I hashing */
|
||||||
/* No alternative hashing system number 2 */
|
/* No alternative hashing system number 2 */
|
||||||
/* No alternative hashing system number 3 */
|
/* No alternative hashing system number 3 */
|
||||||
/* No T.44 (mixed raster content) */
|
|
||||||
|
|
||||||
|
/* No T.44 (mixed raster content) */
|
||||||
/* No page length maximum strip size for T.44 (mixed raster content) */
|
/* No page length maximum strip size for T.44 (mixed raster content) */
|
||||||
/* No simple phase C BFT negotiations */
|
|
||||||
/* No extended BFT negotiations */
|
|
||||||
|
|
||||||
if ((s->supported_t30_features & T30_SUPPORT_INTERNET_SELECTIVE_POLLING_ADDRESS))
|
if ((s->supported_t30_features & T30_SUPPORT_INTERNET_SELECTIVE_POLLING_ADDRESS))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_INTERNET_SELECTIVE_POLLING_ADDRESS);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_INTERNET_SELECTIVE_POLLING_ADDRESS);
|
||||||
@ -1353,9 +1355,9 @@ int t30_build_dis_or_dtc(t30_state_t *s)
|
|||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_COLOUR_GRAY_100_100_CAPABLE);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_COLOUR_GRAY_100_100_CAPABLE);
|
||||||
|
|
||||||
if ((s->supported_bilevel_resolutions & (T4_SUPPORT_RESOLUTION_R8_STANDARD | T4_SUPPORT_RESOLUTION_R8_FINE | T4_SUPPORT_RESOLUTION_R8_SUPERFINE | T4_SUPPORT_RESOLUTION_R16_SUPERFINE)))
|
if ((s->supported_bilevel_resolutions & (T4_SUPPORT_RESOLUTION_R8_STANDARD | T4_SUPPORT_RESOLUTION_R8_FINE | T4_SUPPORT_RESOLUTION_R8_SUPERFINE | T4_SUPPORT_RESOLUTION_R16_SUPERFINE)))
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED);
|
|
||||||
if ((s->supported_bilevel_resolutions & (T4_SUPPORT_RESOLUTION_200_100 | T4_SUPPORT_RESOLUTION_200_200 | T4_SUPPORT_RESOLUTION_200_400 | T4_SUPPORT_RESOLUTION_300_300 | T4_SUPPORT_RESOLUTION_300_600 | T4_SUPPORT_RESOLUTION_400_400 | T4_SUPPORT_RESOLUTION_400_800 | T4_SUPPORT_RESOLUTION_600_600 | T4_SUPPORT_RESOLUTION_600_1200 | T4_SUPPORT_RESOLUTION_1200_1200)))
|
|
||||||
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_METRIC_RESOLUTION_PREFERRED);
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_METRIC_RESOLUTION_PREFERRED);
|
||||||
|
if ((s->supported_bilevel_resolutions & (T4_SUPPORT_RESOLUTION_200_100 | T4_SUPPORT_RESOLUTION_200_200 | T4_SUPPORT_RESOLUTION_200_400 | T4_SUPPORT_RESOLUTION_300_300 | T4_SUPPORT_RESOLUTION_300_600 | T4_SUPPORT_RESOLUTION_400_400 | T4_SUPPORT_RESOLUTION_400_800 | T4_SUPPORT_RESOLUTION_600_600 | T4_SUPPORT_RESOLUTION_600_1200 | T4_SUPPORT_RESOLUTION_1200_1200)))
|
||||||
|
set_ctrl_bit(s->local_dis_dtc_frame, T30_DIS_BIT_INCH_RESOLUTION_PREFERRED);
|
||||||
|
|
||||||
/* No double sided printing (alternate mode) */
|
/* No double sided printing (alternate mode) */
|
||||||
/* No double sided printing (continuous mode) */
|
/* No double sided printing (continuous mode) */
|
||||||
@ -1426,11 +1428,11 @@ static int build_dcs(t30_state_t *s)
|
|||||||
int image_type;
|
int image_type;
|
||||||
|
|
||||||
/* Reacquire page information, in case the image was resized, flattened, etc. */
|
/* Reacquire page information, in case the image was resized, flattened, etc. */
|
||||||
s->x_resolution = t4_tx_get_x_resolution(&s->t4.tx);
|
s->current_page_resolution = t4_tx_get_tx_resolution(&s->t4.tx);
|
||||||
s->y_resolution = t4_tx_get_y_resolution(&s->t4.tx);
|
s->x_resolution = t4_tx_get_tx_x_resolution(&s->t4.tx);
|
||||||
s->current_page_resolution = t4_tx_get_resolution(&s->t4.tx);
|
s->y_resolution = t4_tx_get_tx_y_resolution(&s->t4.tx);
|
||||||
s->image_width = t4_tx_get_image_width(&s->t4.tx);
|
s->image_width = t4_tx_get_tx_image_width(&s->t4.tx);
|
||||||
image_type = t4_tx_get_image_type(&s->t4.tx);
|
image_type = t4_tx_get_tx_image_type(&s->t4.tx);
|
||||||
|
|
||||||
/* Make a DCS frame based on local issues and the latest received DIS/DTC frame.
|
/* Make a DCS frame based on local issues and the latest received DIS/DTC frame.
|
||||||
Negotiate the result based on what both parties can do. */
|
Negotiate the result based on what both parties can do. */
|
||||||
@ -2399,11 +2401,9 @@ static int step_fallback_entry(t30_state_t *s)
|
|||||||
}
|
}
|
||||||
if (fallback_sequence[s->current_fallback].which == 0)
|
if (fallback_sequence[s->current_fallback].which == 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* TODO: This only sets the minimum row time for future pages. It doesn't fix up the
|
/* We need to update the minimum scan time, in case we are in non-ECM mode. */
|
||||||
current page, though it is benign - fallback will only result in an excessive
|
|
||||||
minimum. */
|
|
||||||
set_min_scan_time(s);
|
set_min_scan_time(s);
|
||||||
/* We need to rebuild the DCS message we will send. */
|
/* Now we need to rebuild the DCS message we will send. */
|
||||||
build_dcs(s);
|
build_dcs(s);
|
||||||
return s->current_fallback;
|
return s->current_fallback;
|
||||||
}
|
}
|
||||||
@ -2669,16 +2669,18 @@ static void set_min_scan_time(t30_state_t *s)
|
|||||||
}
|
}
|
||||||
span_log(&s->logging, SPAN_LOG_FLOW, "Remote FAX does not support fine resolution. Squashing image.\n");
|
span_log(&s->logging, SPAN_LOG_FLOW, "Remote FAX does not support fine resolution. Squashing image.\n");
|
||||||
/* Fall through */
|
/* Fall through */
|
||||||
default:
|
|
||||||
case T4_Y_RESOLUTION_STANDARD:
|
case T4_Y_RESOLUTION_STANDARD:
|
||||||
case T4_Y_RESOLUTION_100:
|
case T4_Y_RESOLUTION_100:
|
||||||
s->min_scan_time_code = translate_min_scan_time[0][min_bits_field];
|
s->min_scan_time_code = translate_min_scan_time[0][min_bits_field];
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
s->min_scan_time_code = T30_MIN_SCAN_0MS;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (!s->error_correcting_mode && (s->iaf & T30_IAF_MODE_NO_FILL_BITS))
|
if ((s->iaf & T30_IAF_MODE_NO_FILL_BITS))
|
||||||
min_row_bits = 0;
|
min_row_bits = 0;
|
||||||
else
|
else
|
||||||
min_row_bits = fallback_sequence[s->current_fallback].bit_rate*min_scan_times[s->min_scan_time_code]/1000;
|
min_row_bits = (fallback_sequence[s->current_fallback].bit_rate*min_scan_times[s->min_scan_time_code])/1000;
|
||||||
span_log(&s->logging, SPAN_LOG_FLOW, "Minimum bits per row will be %d\n", min_row_bits);
|
span_log(&s->logging, SPAN_LOG_FLOW, "Minimum bits per row will be %d\n", min_row_bits);
|
||||||
t4_tx_set_min_bits_per_row(&s->t4.tx, min_row_bits);
|
t4_tx_set_min_bits_per_row(&s->t4.tx, min_row_bits);
|
||||||
}
|
}
|
||||||
@ -2714,10 +2716,11 @@ static int start_sending_document(t30_state_t *s)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->x_resolution = t4_tx_get_x_resolution(&s->t4.tx);
|
s->x_resolution = t4_tx_get_tx_x_resolution(&s->t4.tx);
|
||||||
s->y_resolution = t4_tx_get_y_resolution(&s->t4.tx);
|
s->y_resolution = t4_tx_get_tx_y_resolution(&s->t4.tx);
|
||||||
s->image_width = t4_tx_get_image_width(&s->t4.tx);
|
s->image_width = t4_tx_get_tx_image_width(&s->t4.tx);
|
||||||
/* The minimum scan time to be used can't be evaluated until we know the Y resolution. */
|
/* The minimum scan time to be used can't be evaluated until we know the Y resolution, and
|
||||||
|
must be evaluated before the minimum scan row bits can be evaluated. */
|
||||||
set_min_scan_time(s);
|
set_min_scan_time(s);
|
||||||
|
|
||||||
if (s->error_correcting_mode)
|
if (s->error_correcting_mode)
|
||||||
@ -6483,6 +6486,7 @@ SPAN_DECLARE(void) t30_front_end_status(void *user_data, int status)
|
|||||||
{
|
{
|
||||||
/* Send the end of page or partial page message */
|
/* Send the end of page or partial page message */
|
||||||
set_phase(s, T30_PHASE_D_TX);
|
set_phase(s, T30_PHASE_D_TX);
|
||||||
|
if (s->ecm_at_page_end)
|
||||||
s->next_tx_step = check_next_tx_step(s);
|
s->next_tx_step = check_next_tx_step(s);
|
||||||
if (send_pps_frame(s) == T30_NULL)
|
if (send_pps_frame(s) == T30_NULL)
|
||||||
set_state(s, T30_STATE_IV_PPS_NULL);
|
set_state(s, T30_STATE_IV_PPS_NULL);
|
||||||
@ -6808,7 +6812,10 @@ SPAN_DECLARE(t30_state_t *) t30_init(t30_state_t *s,
|
|||||||
s->supported_compressions = T4_SUPPORT_COMPRESSION_T4_1D | T4_SUPPORT_COMPRESSION_T4_2D;
|
s->supported_compressions = T4_SUPPORT_COMPRESSION_T4_1D | T4_SUPPORT_COMPRESSION_T4_2D;
|
||||||
s->supported_bilevel_resolutions = T4_SUPPORT_RESOLUTION_R8_STANDARD
|
s->supported_bilevel_resolutions = T4_SUPPORT_RESOLUTION_R8_STANDARD
|
||||||
| T4_SUPPORT_RESOLUTION_R8_FINE
|
| T4_SUPPORT_RESOLUTION_R8_FINE
|
||||||
| T4_SUPPORT_RESOLUTION_R8_SUPERFINE;
|
| T4_SUPPORT_RESOLUTION_R8_SUPERFINE
|
||||||
|
| T4_SUPPORT_RESOLUTION_200_100
|
||||||
|
| T4_SUPPORT_RESOLUTION_200_200
|
||||||
|
| T4_SUPPORT_RESOLUTION_200_400;
|
||||||
s->supported_image_sizes = T4_SUPPORT_WIDTH_215MM
|
s->supported_image_sizes = T4_SUPPORT_WIDTH_215MM
|
||||||
| T4_SUPPORT_LENGTH_US_LETTER
|
| T4_SUPPORT_LENGTH_US_LETTER
|
||||||
| T4_SUPPORT_LENGTH_US_LEGAL
|
| T4_SUPPORT_LENGTH_US_LEGAL
|
||||||
|
@ -371,6 +371,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
s->metadata.image_length = t88_decode_get_image_length(&s->decoder.t88);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -383,6 +384,7 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
s->metadata.image_length = t45_decode_get_image_length(&s->decoder.t45);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -884,7 +886,7 @@ SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_han
|
|||||||
return t85_decode_set_row_write_handler(&s->decoder.t85, handler, user_data);
|
return t85_decode_set_row_write_handler(&s->decoder.t85, handler, user_data);
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
break;
|
return t88_decode_set_row_write_handler(&s->decoder.t88, handler, user_data);
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
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);
|
||||||
@ -894,7 +896,7 @@ SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_han
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
break;
|
return t45_decode_set_row_write_handler(&s->decoder.t45, handler, user_data);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@ -942,7 +944,7 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
t->type = 0;
|
t->type = T4_IMAGE_TYPE_COLOUR_8BIT; //T4_IMAGE_TYPE_GRAY_8BIT;
|
||||||
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);
|
||||||
t->image_type = t->type;
|
t->image_type = t->type;
|
||||||
@ -952,7 +954,7 @@ SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T43)
|
#if defined(SPANDSP_SUPPORT_T43)
|
||||||
case T4_COMPRESSION_T43:
|
case T4_COMPRESSION_T43:
|
||||||
t->type = 0;
|
t->type = T4_IMAGE_TYPE_COLOUR_8BIT;
|
||||||
t->width = t43_decode_get_image_width(&s->decoder.t43);
|
t->width = t43_decode_get_image_width(&s->decoder.t43);
|
||||||
t->length = t43_decode_get_image_length(&s->decoder.t43);
|
t->length = t43_decode_get_image_length(&s->decoder.t43);
|
||||||
t->image_type = t->type;
|
t->image_type = t->type;
|
||||||
@ -986,6 +988,7 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
t88_decode_restart(&s->decoder.t88);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -998,6 +1001,7 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
t45_decode_restart(&s->decoder.t45);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1052,11 +1056,17 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
t88_decode_put(&s->decoder.t88, NULL, 0);
|
||||||
|
length = t88_decode_get_image_length(&s->decoder.t88);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
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);
|
||||||
|
if (s->decoder.t42.samples_per_pixel == 3)
|
||||||
|
select_tiff_compression(s, T4_IMAGE_TYPE_COLOUR_8BIT);
|
||||||
|
else
|
||||||
|
select_tiff_compression(s, T4_IMAGE_TYPE_GRAY_8BIT);
|
||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T43)
|
#if defined(SPANDSP_SUPPORT_T43)
|
||||||
case T4_COMPRESSION_T43:
|
case T4_COMPRESSION_T43:
|
||||||
@ -1066,6 +1076,8 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
t45_decode_put(&s->decoder.t45, NULL, 0);
|
||||||
|
length = t45_decode_get_image_length(&s->decoder.t45);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1156,7 +1168,7 @@ SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s)
|
|||||||
return t85_decode_release(&s->decoder.t85);
|
return t85_decode_release(&s->decoder.t85);
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
break;
|
return t88_decode_release(&s->decoder.t88);
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
return t42_decode_release(&s->decoder.t42);
|
return t42_decode_release(&s->decoder.t42);
|
||||||
@ -1166,7 +1178,7 @@ SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
break;
|
return t45_decode_release(&s->decoder.t45);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -485,7 +485,7 @@ static int test_tiff_directory_info(t4_tx_state_t *s)
|
|||||||
|
|
||||||
parm32 = 0;
|
parm32 = 0;
|
||||||
TIFFGetField(t->tiff_file, TIFFTAG_IMAGEWIDTH, &parm32);
|
TIFFGetField(t->tiff_file, TIFFTAG_IMAGEWIDTH, &parm32);
|
||||||
if (s->metadata.image_width != (int) parm32)
|
if (s->tiff.image_width != (int) parm32)
|
||||||
return 1;
|
return 1;
|
||||||
x_resolution = 0.0f;
|
x_resolution = 0.0f;
|
||||||
TIFFGetField(t->tiff_file, TIFFTAG_XRESOLUTION, &x_resolution);
|
TIFFGetField(t->tiff_file, TIFFTAG_XRESOLUTION, &x_resolution);
|
||||||
@ -541,16 +541,16 @@ static int tiff_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
|||||||
int j;
|
int j;
|
||||||
|
|
||||||
s = (t4_tx_state_t *) user_data;
|
s = (t4_tx_state_t *) user_data;
|
||||||
if (s->tiff.row >= s->metadata.image_length)
|
if (s->tiff.row >= s->tiff.image_length)
|
||||||
return 0;
|
return 0;
|
||||||
memcpy(buf, &s->tiff.image_buffer[s->tiff.row*len], len);
|
memcpy(buf, &s->tiff.image_buffer[s->tiff.row*len], len);
|
||||||
s->tiff.row++;
|
s->tiff.row++;
|
||||||
|
|
||||||
/* If this is a bi-level image which has more vertical resolution than the
|
/* If this is a bi-level image which has more vertical resolution than the
|
||||||
far end will accept, we need to squash it down to size. */
|
far end will accept, we need to squash it down to size. */
|
||||||
for (i = 1; i < s->row_squashing_ratio && s->tiff.row < s->metadata.image_length; i++)
|
for (i = 1; i < s->row_squashing_ratio && s->tiff.row < s->tiff.image_length; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < s->metadata.image_width/8; j++)
|
for (j = 0; j < s->tiff.image_width/8; j++)
|
||||||
buf[j] |= s->tiff.image_buffer[s->tiff.row*len + j];
|
buf[j] |= s->tiff.image_buffer[s->tiff.row*len + j];
|
||||||
s->tiff.row++;
|
s->tiff.row++;
|
||||||
}
|
}
|
||||||
@ -604,7 +604,6 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
|
|||||||
{
|
{
|
||||||
int biggest;
|
int biggest;
|
||||||
int num_strips;
|
int num_strips;
|
||||||
int total_len;
|
|
||||||
int len;
|
int len;
|
||||||
int i;
|
int i;
|
||||||
int result;
|
int result;
|
||||||
@ -615,8 +614,8 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
|
|||||||
|
|
||||||
/* Size up and allocate the buffer for the raw data */
|
/* Size up and allocate the buffer for the raw data */
|
||||||
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
||||||
biggest = TIFFRawStripSize(s->tiff.tiff_file, 0);
|
biggest = 0;
|
||||||
for (i = 1; i < num_strips; i++)
|
for (i = 0; i < num_strips; i++)
|
||||||
{
|
{
|
||||||
len = TIFFRawStripSize(s->tiff.tiff_file, i);
|
len = TIFFRawStripSize(s->tiff.tiff_file, i);
|
||||||
if (len > biggest)
|
if (len > biggest)
|
||||||
@ -625,11 +624,14 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
|
|||||||
if ((raw_data = malloc(biggest)) == NULL)
|
if ((raw_data = malloc(biggest)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
s->tiff.image_size = s->metadata.image_length*((s->metadata.image_width + 7)/8);
|
s->tiff.image_size = s->tiff.image_length*((s->tiff.image_width + 7)/8);
|
||||||
if (s->tiff.image_size >= s->tiff.image_buffer_size)
|
if (s->tiff.image_size >= s->tiff.image_buffer_size)
|
||||||
{
|
{
|
||||||
if ((t = realloc(s->tiff.image_buffer, s->tiff.image_size)) == NULL)
|
if ((t = realloc(s->tiff.image_buffer, s->tiff.image_size)) == NULL)
|
||||||
|
{
|
||||||
|
free(raw_data);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
s->tiff.image_buffer_size = s->tiff.image_size;
|
s->tiff.image_buffer_size = s->tiff.image_size;
|
||||||
s->tiff.image_buffer = t;
|
s->tiff.image_buffer = t;
|
||||||
}
|
}
|
||||||
@ -640,14 +642,14 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
|
|||||||
t85_decode_init(&t85, packing_row_write_handler, &pack);
|
t85_decode_init(&t85, packing_row_write_handler, &pack);
|
||||||
t85_decode_set_comment_handler(&t85, 1000, embedded_comment_handler, s);
|
t85_decode_set_comment_handler(&t85, 1000, embedded_comment_handler, s);
|
||||||
|
|
||||||
total_len = 0;
|
|
||||||
result = -1;
|
result = -1;
|
||||||
for (i = 0; i < num_strips; i++, total_len += len)
|
for (i = 0; i < num_strips; i++)
|
||||||
{
|
{
|
||||||
len = TIFFRawStripSize(s->tiff.tiff_file, i);
|
len = TIFFRawStripSize(s->tiff.tiff_file, i);
|
||||||
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, raw_data, len)) < 0)
|
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, raw_data, len)) < 0)
|
||||||
{
|
{
|
||||||
span_log(&s->logging, SPAN_LOG_WARNING, "%s: ReadRaw error.\n", s->tiff.file);
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: TIFFReadRawStrip error.\n", s->tiff.file);
|
||||||
|
free(raw_data);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
result = t85_decode_put(&t85, raw_data, len);
|
result = t85_decode_put(&t85, raw_data, len);
|
||||||
@ -658,7 +660,7 @@ static int read_tiff_t85_image(t4_tx_state_t *s)
|
|||||||
result = t85_decode_put(&t85, NULL, 0);
|
result = t85_decode_put(&t85, NULL, 0);
|
||||||
|
|
||||||
len = t85_decode_get_compressed_image_size(&t85);
|
len = t85_decode_get_compressed_image_size(&t85);
|
||||||
span_log(&s->logging, SPAN_LOG_WARNING, "Compressed image is %d bytes, %d rows\n", len/8, s->metadata.image_length);
|
span_log(&s->logging, SPAN_LOG_WARNING, "Compressed image is %d bytes, %d rows\n", len/8, s->tiff.image_length);
|
||||||
t85_decode_release(&t85);
|
t85_decode_release(&t85);
|
||||||
free(raw_data);
|
free(raw_data);
|
||||||
return 0;
|
return 0;
|
||||||
@ -717,20 +719,26 @@ static int read_tiff_t43_image(t4_tx_state_t *s, uint8_t **buf)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
static int read_tiff_t42_t81_image(t4_tx_state_t *s, uint8_t **buf)
|
static int read_tiff_t42_t81_image(t4_tx_state_t *s)
|
||||||
{
|
{
|
||||||
int total_len;
|
int total_len;
|
||||||
int len;
|
int len;
|
||||||
int i;
|
int i;
|
||||||
int num_strips;
|
int num_strips;
|
||||||
int total_image_len;
|
int total_image_len;
|
||||||
int image_size;
|
uint8_t *t;
|
||||||
uint8_t *raw_data;
|
uint8_t *raw_data;
|
||||||
uint8_t *jpeg_table;
|
uint8_t *jpeg_table;
|
||||||
uint32_t jpeg_table_len;
|
uint32_t jpeg_table_len;
|
||||||
uint32_t w;
|
packer_t pack;
|
||||||
uint32_t h;
|
uint16_t bits_per_sample;
|
||||||
tsize_t off;
|
uint16_t samples_per_pixel;
|
||||||
|
t42_decode_state_t t42;
|
||||||
|
|
||||||
|
bits_per_sample = 1;
|
||||||
|
TIFFGetField(s->tiff.tiff_file, TIFFTAG_BITSPERSAMPLE, &bits_per_sample);
|
||||||
|
samples_per_pixel = 1;
|
||||||
|
TIFFGetField(s->tiff.tiff_file, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel);
|
||||||
|
|
||||||
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
||||||
total_image_len = 0;
|
total_image_len = 0;
|
||||||
@ -753,7 +761,8 @@ static int read_tiff_t42_t81_image(t4_tx_state_t *s, uint8_t **buf)
|
|||||||
{
|
{
|
||||||
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, &raw_data[total_len], total_image_len - total_len)) < 0)
|
if ((len = TIFFReadRawStrip(s->tiff.tiff_file, i, &raw_data[total_len], total_image_len - total_len)) < 0)
|
||||||
{
|
{
|
||||||
span_log(&s->logging, SPAN_LOG_FLOW, "TIFF read error.\n");
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: TIFFReadRawStrip error.\n", s->tiff.file);
|
||||||
|
free(raw_data);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -763,18 +772,30 @@ static int read_tiff_t42_t81_image(t4_tx_state_t *s, uint8_t **buf)
|
|||||||
if (total_len != total_image_len)
|
if (total_len != total_image_len)
|
||||||
span_log(&s->logging, SPAN_LOG_FLOW, "Size mismatch %d %d\n", (int) total_len, (int) total_image_len);
|
span_log(&s->logging, SPAN_LOG_FLOW, "Size mismatch %d %d\n", (int) total_len, (int) total_image_len);
|
||||||
|
|
||||||
image_size = 3*s->metadata.image_length*s->metadata.image_width;
|
s->tiff.image_size = samples_per_pixel*s->tiff.image_width*s->tiff.image_length;
|
||||||
if ((*buf = malloc(image_size)) == NULL)
|
if (s->tiff.image_size >= s->tiff.image_buffer_size)
|
||||||
return -1;
|
|
||||||
|
|
||||||
off = 0;
|
|
||||||
if (!t42_itulab_to_srgb(&s->logging, &s->lab_params, *buf, &off, raw_data, total_image_len, &w, &h))
|
|
||||||
{
|
{
|
||||||
span_log(&s->logging, SPAN_LOG_FLOW, "Failed to convert from ITULAB.\n");
|
if ((t = realloc(s->tiff.image_buffer, s->tiff.image_size)) == NULL)
|
||||||
|
{
|
||||||
|
free(raw_data);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
s->tiff.image_buffer_size = s->tiff.image_size;
|
||||||
|
s->tiff.image_buffer = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
t42_decode_init(&t42, packing_row_write_handler, &pack);
|
||||||
|
|
||||||
|
pack.buf = s->tiff.image_buffer;
|
||||||
|
pack.ptr = 0;
|
||||||
|
pack.row = 0;
|
||||||
|
|
||||||
|
t42_decode_put(&t42, raw_data, total_image_len);
|
||||||
|
t42_decode_put(&t42, NULL, 0);
|
||||||
|
|
||||||
|
t42_decode_release(&t42);
|
||||||
free(raw_data);
|
free(raw_data);
|
||||||
return image_size;
|
return s->tiff.image_size;
|
||||||
}
|
}
|
||||||
/*- End of function --------------------------------------------------------*/
|
/*- End of function --------------------------------------------------------*/
|
||||||
#endif
|
#endif
|
||||||
@ -789,7 +810,7 @@ static int read_tiff_decompressed_image(t4_tx_state_t *s)
|
|||||||
|
|
||||||
/* Decode the whole image into a buffer */
|
/* Decode the whole image into a buffer */
|
||||||
/* Let libtiff handle the decompression */
|
/* Let libtiff handle the decompression */
|
||||||
s->tiff.image_size = s->metadata.image_length*TIFFScanlineSize(s->tiff.tiff_file);
|
s->tiff.image_size = s->tiff.image_length*TIFFScanlineSize(s->tiff.tiff_file);
|
||||||
if (s->tiff.image_size >= s->tiff.image_buffer_size)
|
if (s->tiff.image_size >= s->tiff.image_buffer_size)
|
||||||
{
|
{
|
||||||
if ((t = realloc(s->tiff.image_buffer, s->tiff.image_size)) == NULL)
|
if ((t = realloc(s->tiff.image_buffer, s->tiff.image_size)) == NULL)
|
||||||
@ -798,14 +819,13 @@ static int read_tiff_decompressed_image(t4_tx_state_t *s)
|
|||||||
s->tiff.image_buffer = t;
|
s->tiff.image_buffer = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow for the image being stored in multiple strips, although it is rare to find
|
/* Allow for the image being stored in multiple strips. */
|
||||||
a stripped image in a T.4 or T.6 encoded file. */
|
|
||||||
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
num_strips = TIFFNumberOfStrips(s->tiff.tiff_file);
|
||||||
for (i = 0, total_len = 0; i < num_strips; i++, total_len += len)
|
for (i = 0, total_len = 0; i < num_strips; i++, total_len += len)
|
||||||
{
|
{
|
||||||
if ((len = TIFFReadEncodedStrip(s->tiff.tiff_file, i, &s->tiff.image_buffer[total_len], s->tiff.image_size - total_len)) < 0)
|
if ((len = TIFFReadEncodedStrip(s->tiff.tiff_file, i, &s->tiff.image_buffer[total_len], s->tiff.image_size - total_len)) < 0)
|
||||||
{
|
{
|
||||||
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Read error.\n", s->tiff.file);
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: TIFFReadEncodedStrip error.\n", s->tiff.file);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -935,7 +955,7 @@ static int set_row_read_handler(t4_tx_state_t *s, t4_row_read_handler_t handler,
|
|||||||
return t85_encode_set_row_read_handler(&s->encoder.t85, handler, user_data);
|
return t85_encode_set_row_read_handler(&s->encoder.t85, handler, user_data);
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
break;
|
return t88_encode_set_row_read_handler(&s->encoder.t88, handler, user_data);
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
case T4_COMPRESSION_SYCC_T81:
|
case T4_COMPRESSION_SYCC_T81:
|
||||||
@ -946,7 +966,7 @@ static int set_row_read_handler(t4_tx_state_t *s, t4_row_read_handler_t handler,
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
break;
|
return t45_encode_set_row_read_handler(&s->encoder.t45, handler, user_data);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
@ -997,7 +1017,8 @@ static int make_header(t4_tx_state_t *s)
|
|||||||
|
|
||||||
static int header_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
static int header_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
||||||
{
|
{
|
||||||
int repeats;
|
int x_repeats;
|
||||||
|
int y_repeats;
|
||||||
int pattern;
|
int pattern;
|
||||||
int pos;
|
int pos;
|
||||||
int row;
|
int row;
|
||||||
@ -1008,28 +1029,30 @@ static int header_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
|||||||
switch (s->metadata.y_resolution)
|
switch (s->metadata.y_resolution)
|
||||||
{
|
{
|
||||||
case T4_Y_RESOLUTION_1200:
|
case T4_Y_RESOLUTION_1200:
|
||||||
repeats = 12;
|
y_repeats = 12;
|
||||||
break;
|
break;
|
||||||
case T4_Y_RESOLUTION_800:
|
case T4_Y_RESOLUTION_800:
|
||||||
repeats = 8;
|
y_repeats = 8;
|
||||||
break;
|
break;
|
||||||
case T4_Y_RESOLUTION_600:
|
case T4_Y_RESOLUTION_600:
|
||||||
repeats = 6;
|
y_repeats = 6;
|
||||||
break;
|
break;
|
||||||
case T4_Y_RESOLUTION_SUPERFINE:
|
case T4_Y_RESOLUTION_SUPERFINE:
|
||||||
repeats = 4;
|
case T4_Y_RESOLUTION_400:
|
||||||
|
y_repeats = 4;
|
||||||
break;
|
break;
|
||||||
case T4_Y_RESOLUTION_300:
|
case T4_Y_RESOLUTION_300:
|
||||||
repeats = 3;
|
y_repeats = 3;
|
||||||
break;
|
break;
|
||||||
case T4_Y_RESOLUTION_FINE:
|
case T4_Y_RESOLUTION_FINE:
|
||||||
repeats = 2;
|
case T4_Y_RESOLUTION_200:
|
||||||
|
y_repeats = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
repeats = 1;
|
y_repeats = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
repeats /= s->row_squashing_ratio;
|
y_repeats /= s->row_squashing_ratio;
|
||||||
if (s->header_overlays_image)
|
if (s->header_overlays_image)
|
||||||
{
|
{
|
||||||
/* Read and dump a row of the real image, allowing for the possibility
|
/* Read and dump a row of the real image, allowing for the possibility
|
||||||
@ -1040,7 +1063,7 @@ static int header_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
row = s->header_row/repeats;
|
row = s->header_row/y_repeats;
|
||||||
pos = 0;
|
pos = 0;
|
||||||
for (t = s->header_text; *t && pos <= len - 2; t++)
|
for (t = s->header_text; *t && pos <= len - 2; t++)
|
||||||
{
|
{
|
||||||
@ -1051,7 +1074,7 @@ static int header_row_read_handler(void *user_data, uint8_t buf[], size_t len)
|
|||||||
while (pos < len)
|
while (pos < len)
|
||||||
buf[pos++] = 0;
|
buf[pos++] = 0;
|
||||||
s->header_row++;
|
s->header_row++;
|
||||||
if (s->header_row >= 16*repeats)
|
if (s->header_row >= 16*y_repeats)
|
||||||
{
|
{
|
||||||
/* End of header. Change to normal image row data. */
|
/* End of header. Change to normal image row data. */
|
||||||
set_row_read_handler(s, s->row_handler, s->row_handler_user_data);
|
set_row_read_handler(s, s->row_handler, s->row_handler_user_data);
|
||||||
@ -1089,10 +1112,10 @@ SPAN_DECLARE(int) t4_tx_set_row_read_handler(t4_tx_state_t *s, t4_row_read_handl
|
|||||||
}
|
}
|
||||||
/*- End of function --------------------------------------------------------*/
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int compression)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
switch (encoding)
|
switch (compression)
|
||||||
{
|
{
|
||||||
case T4_COMPRESSION_T4_1D:
|
case T4_COMPRESSION_T4_1D:
|
||||||
case T4_COMPRESSION_T4_2D:
|
case T4_COMPRESSION_T4_2D:
|
||||||
@ -1104,12 +1127,12 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
case T4_COMPRESSION_T6:
|
case T4_COMPRESSION_T6:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
t4_t6_encode_init(&s->encoder.t4_t6, encoding, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
t4_t6_encode_init(&s->encoder.t4_t6, compression, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
t4_t6_encode_set_max_2d_rows_per_1d_row(&s->encoder.t4_t6, -s->metadata.y_resolution);
|
t4_t6_encode_set_max_2d_rows_per_1d_row(&s->encoder.t4_t6, -s->metadata.y_resolution);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
if (t4_t6_encode_set_encoding(&s->encoder.t4_t6, encoding))
|
if (t4_t6_encode_set_encoding(&s->encoder.t4_t6, compression))
|
||||||
return -1;
|
return -1;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
case T4_COMPRESSION_T85:
|
case T4_COMPRESSION_T85:
|
||||||
@ -1123,7 +1146,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
t85_encode_init(&s->encoder.t85, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
t85_encode_init(&s->encoder.t85, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
@ -1132,9 +1155,10 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
t88_encode_init(&s->encoder.t88, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -1148,7 +1172,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
t42_encode_init(&s->encoder.t42, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
t42_encode_init(&s->encoder.t42, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
#if defined(SPANDSP_SUPPORT_T43)
|
#if defined(SPANDSP_SUPPORT_T43)
|
||||||
case T4_COMPRESSION_T43:
|
case T4_COMPRESSION_T43:
|
||||||
@ -1160,7 +1184,7 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
t43_encode_init(&s->encoder.t43, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
t43_encode_init(&s->encoder.t43, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
@ -1170,9 +1194,10 @@ SPAN_DECLARE(int) t4_tx_set_tx_encoding(t4_tx_state_t *s, int encoding)
|
|||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
t45_encode_init(&s->encoder.t45, s->metadata.image_width, s->metadata.image_length, s->row_handler, s->row_handler_user_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->metadata.compression = encoding;
|
s->metadata.compression = compression;
|
||||||
return s->metadata.compression;
|
return s->metadata.compression;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1194,6 +1219,42 @@ SPAN_DECLARE(void) t4_tx_set_min_bits_per_row(t4_tx_state_t *s, int bits)
|
|||||||
}
|
}
|
||||||
/*- End of function --------------------------------------------------------*/
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_compression(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.compression;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_image_type(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.image_type;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_resolution(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.resolution_code;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_x_resolution(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.x_resolution;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_y_resolution(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.y_resolution;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
|
SPAN_DECLARE(int) t4_tx_get_tx_image_width(t4_tx_state_t *s)
|
||||||
|
{
|
||||||
|
return s->metadata.image_width;
|
||||||
|
}
|
||||||
|
/*- End of function --------------------------------------------------------*/
|
||||||
|
|
||||||
SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width)
|
SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width)
|
||||||
{
|
{
|
||||||
s->metadata.image_width = image_width;
|
s->metadata.image_width = image_width;
|
||||||
@ -1210,6 +1271,7 @@ SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width)
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
t88_encode_set_image_width(&s->encoder.t88, image_width);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -1223,6 +1285,7 @@ SPAN_DECLARE(void) t4_tx_set_image_width(t4_tx_state_t *s, int image_width)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
t45_encode_set_image_width(&s->encoder.t45, image_width);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1240,6 +1303,7 @@ static void t4_tx_set_image_length(t4_tx_state_t *s, uint32_t image_length)
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
t88_encode_set_image_length(&s->encoder.t88, image_length);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -1253,6 +1317,7 @@ static void t4_tx_set_image_length(t4_tx_state_t *s, uint32_t image_length)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
t45_encode_set_image_length(&s->encoder.t45, image_length);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1382,6 +1447,9 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t
|
|||||||
break;
|
break;
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
|
t->width = t88_encode_get_image_width(&s->encoder.t88);
|
||||||
|
t->length = t88_encode_get_image_length(&s->encoder.t88);
|
||||||
|
t->line_image_size = t88_encode_get_compressed_image_size(&s->encoder.t88)/8;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
@ -1401,6 +1469,9 @@ SPAN_DECLARE(void) t4_tx_get_transfer_statistics(t4_tx_state_t *s, t4_stats_t *t
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
|
t->width = t45_encode_get_image_width(&s->encoder.t45);
|
||||||
|
t->length = t45_encode_get_image_length(&s->encoder.t45);
|
||||||
|
t->line_image_size = t45_encode_get_compressed_image_size(&s->encoder.t45)/8;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -1471,7 +1542,7 @@ SPAN_DECLARE(int) t4_tx_get(t4_tx_state_t *s, uint8_t buf[], size_t max_len)
|
|||||||
return t85_encode_get(&s->encoder.t85, buf, max_len);
|
return t85_encode_get(&s->encoder.t85, buf, max_len);
|
||||||
#if defined(SPANDSP_SUPPORT_T88)
|
#if defined(SPANDSP_SUPPORT_T88)
|
||||||
case T4_COMPRESSION_T88:
|
case T4_COMPRESSION_T88:
|
||||||
break;
|
return t88_encode_get(&s->encoder.t88, buf, max_len);
|
||||||
#endif
|
#endif
|
||||||
case T4_COMPRESSION_T42_T81:
|
case T4_COMPRESSION_T42_T81:
|
||||||
case T4_COMPRESSION_SYCC_T81:
|
case T4_COMPRESSION_SYCC_T81:
|
||||||
@ -1482,7 +1553,7 @@ SPAN_DECLARE(int) t4_tx_get(t4_tx_state_t *s, uint8_t buf[], size_t max_len)
|
|||||||
#endif
|
#endif
|
||||||
#if defined(SPANDSP_SUPPORT_T45)
|
#if defined(SPANDSP_SUPPORT_T45)
|
||||||
case T4_COMPRESSION_T45:
|
case T4_COMPRESSION_T45:
|
||||||
break;
|
return t45_encode_get(&s->encoder.t45, buf, max_len);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1548,7 +1619,6 @@ SPAN_DECLARE(int) t4_tx_start_page(t4_tx_state_t *s)
|
|||||||
s->image_get_handler = NULL;
|
s->image_get_handler = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If there is a page header, create that first */
|
/* If there is a page header, create that first */
|
||||||
if (s->metadata.image_type == T4_IMAGE_TYPE_BILEVEL && s->header_info && s->header_info[0] && make_header(s) == 0)
|
if (s->metadata.image_type == T4_IMAGE_TYPE_BILEVEL && s->header_info && s->header_info[0] && make_header(s) == 0)
|
||||||
//if (s->header_info && s->header_info[0] && make_header(s) == 0)
|
//if (s->header_info && s->header_info[0] && make_header(s) == 0)
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user