Tweaks to spandsp

This commit is contained in:
Steve Underwood 2013-07-24 00:21:23 +08:00
parent abcf4ac7e6
commit c1e5175290
4 changed files with 1014 additions and 468 deletions

View File

@ -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

View File

@ -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;

View File

@ -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