1 /* 2 * SpanDSP - a series of DSP components for telephony 3 * 4 * t4_rx.h - definitions for T.4 FAX receive processing 5 * 6 * Written by Steve Underwood <steveu@coppice.org> 7 * 8 * Copyright (C) 2003 Steve Underwood 9 * 10 * All rights reserved. 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU Lesser General Public License version 2.1, 14 * as published by the Free Software Foundation. 15 * 16 * This program is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU Lesser General Public License for more details. 20 * 21 * You should have received a copy of the GNU Lesser General Public 22 * License along with this program; if not, write to the Free Software 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24 */ 25 26 /*! \file */ 27 28 #if !defined(_SPANDSP_T4_RX_H_) 29 #define _SPANDSP_T4_RX_H_ 30 31 /*! \page t4_page T.4 image compression and decompression 32 33 \section t4_page_sec_1 What does it do? 34 The T.4 image compression and decompression routines implement the 1D and 2D 35 encoding methods defined in ITU specification T.4. They also implement the pure 36 2D encoding method defined in T.6. These are image compression algorithms used 37 for FAX transmission. 38 39 \section t4_page_sec_1 How does it work? 40 */ 41 42 /*! This function is a callback from the image decoders, to write the decoded bi-level image, 43 row by row. It is called for each row, with len set to the number of bytes per row. At the 44 end of the image it is called with len set to zero, to indicate the end of image condition. 45 \return 0 for OK, or non-zero for a problem that requires the image be interrupted. */ 46 typedef int (*t4_row_write_handler_t)(void *user_data, const uint8_t buf[], size_t len); 47 48 /*! Supported compression modes. */ 49 typedef enum 50 { 51 /*! No compression */ 52 T4_COMPRESSION_NONE = 0x01, 53 /*! T.4 1D compression */ 54 T4_COMPRESSION_T4_1D = 0x02, 55 /*! T.4 2D compression */ 56 T4_COMPRESSION_T4_2D = 0x04, 57 /*! T.6 2D compression */ 58 T4_COMPRESSION_T6 = 0x08, 59 /*! T.85 monochrome JBIG coding with L0 fixed. */ 60 T4_COMPRESSION_T85 = 0x10, 61 /*! T.85 monochrome JBIG coding with L0 variable. */ 62 T4_COMPRESSION_T85_L0 = 0x20, 63 /*! T.43 gray-scale/colour JBIG coding */ 64 T4_COMPRESSION_T43 = 0x40, 65 /*! T.45 run length colour compression */ 66 T4_COMPRESSION_T45 = 0x80, 67 /*! T.42 + T.81 + T.30 Annex E colour JPEG coding */ 68 T4_COMPRESSION_T42_T81 = 0x100, 69 /*! T.42 + T.81 + T.30 Annex K colour sYCC-JPEG coding */ 70 T4_COMPRESSION_SYCC_T81 = 0x200, 71 /*! T.88 monochrome JBIG2 compression */ 72 T4_COMPRESSION_T88 = 0x400, 73 /*! Uncompressed image. This compression cannot be used for FAXes. It is provided for specifying 74 output formats for received images. */ 75 T4_COMPRESSION_UNCOMPRESSED = 0x1000, 76 /*! Conventional JPEG. This compression cannot be used for FAXes. It is provided for specifying 77 output formats for received images. */ 78 T4_COMPRESSION_JPEG = 0x2000, 79 /*! Support solour compression without sub-sampling */ 80 T4_COMPRESSION_NO_SUBSAMPLING = 0x800000, 81 /*! Gray-scale support by multi-level codecs */ 82 T4_COMPRESSION_GRAYSCALE = 0x1000000, 83 /*! Colour support by multi-level codecs */ 84 T4_COMPRESSION_COLOUR = 0x2000000, 85 /*! 12 bit mode for gray-scale and colour */ 86 T4_COMPRESSION_12BIT = 0x4000000, 87 /*! Convert a colour image to a gray-scale one */ 88 T4_COMPRESSION_COLOUR_TO_GRAY = 0x8000000, 89 /*! Dither a gray-scale image down a simple bilevel image, with rescaling to fit a FAX page */ 90 T4_COMPRESSION_GRAY_TO_BILEVEL = 0x10000000, 91 /*! Dither a colour image down a simple bilevel image, with rescaling to fit a FAX page */ 92 T4_COMPRESSION_COLOUR_TO_BILEVEL = 0x20000000, 93 /*! Rescale an image (except a bi-level image) to fit a permitted FAX width when necessary */ 94 T4_COMPRESSION_RESCALING = 0x40000000 95 } t4_image_compression_t; 96 97 /*! Image type */ 98 typedef enum 99 { 100 /* Traditional black and white FAX */ 101 T4_IMAGE_TYPE_BILEVEL = 0, 102 /* RGB or CMY image */ 103 T4_IMAGE_TYPE_COLOUR_BILEVEL = 1, 104 /* CMYK image */ 105 T4_IMAGE_TYPE_4COLOUR_BILEVEL = 2, 106 /* 2 to 8 bits per pixel gray-scale image */ 107 T4_IMAGE_TYPE_GRAY_8BIT = 3, 108 /* 9 to 12 bits per pixel gray-scale image */ 109 T4_IMAGE_TYPE_GRAY_12BIT = 4, 110 /* 2 to 8 bits per pixel RGB or CMY colour image */ 111 T4_IMAGE_TYPE_COLOUR_8BIT = 5, 112 /* 2 to 8 bits per pixel CMYK colour image */ 113 T4_IMAGE_TYPE_4COLOUR_8BIT = 6, 114 /* 9 to 12 bits per pixel RGB or CMY colour image */ 115 T4_IMAGE_TYPE_COLOUR_12BIT = 7, 116 /* 9 to 12 bits per pixel CMYK colour image */ 117 T4_IMAGE_TYPE_4COLOUR_12BIT = 8 118 } t4_image_types_t; 119 120 /*! Supported X resolutions, in pixels per metre. */ 121 typedef enum 122 { 123 T4_X_RESOLUTION_100 = 3937, 124 T4_X_RESOLUTION_R4 = 4020, 125 T4_X_RESOLUTION_200 = 7874, 126 T4_X_RESOLUTION_R8 = 8040, 127 T4_X_RESOLUTION_300 = 11811, 128 T4_X_RESOLUTION_400 = 15748, 129 T4_X_RESOLUTION_R16 = 16080, 130 T4_X_RESOLUTION_600 = 23622, 131 T4_X_RESOLUTION_1200 = 47244 132 } t4_image_x_resolution_t; 133 134 /*! Supported Y resolutions, in pixels per metre. */ 135 typedef enum 136 { 137 T4_Y_RESOLUTION_STANDARD = 3850, 138 T4_Y_RESOLUTION_100 = 3937, 139 T4_Y_RESOLUTION_FINE = 7700, 140 T4_Y_RESOLUTION_200 = 7874, 141 T4_Y_RESOLUTION_300 = 11811, 142 T4_Y_RESOLUTION_SUPERFINE = 15400, 143 T4_Y_RESOLUTION_400 = 15748, 144 T4_Y_RESOLUTION_600 = 23622, 145 T4_Y_RESOLUTION_800 = 31496, 146 T4_Y_RESOLUTION_1200 = 47244 147 } t4_image_y_resolution_t; 148 149 /* Only the symmetric resolutions are valid for gray-scale and colour use. The asymmetric 150 ones are bi-level only. */ 151 enum 152 { 153 /*! Standard FAX resolution 204dpi x 98dpi - bi-level only */ 154 T4_RESOLUTION_R8_STANDARD = 0x1, 155 /*! Fine FAX resolution 204dpi x 196dpi - bi-level only */ 156 T4_RESOLUTION_R8_FINE = 0x2, 157 /*! Super-fine FAX resolution 204dpi x 391dpi - bi-level only */ 158 T4_RESOLUTION_R8_SUPERFINE = 0x4, 159 /*! Double FAX resolution 408dpi x 391dpi - bi-level only */ 160 T4_RESOLUTION_R16_SUPERFINE = 0x8, 161 162 /*! 100dpi x 100dpi - gray-scale and colour only */ 163 T4_RESOLUTION_100_100 = 0x10, 164 /*! 200dpi x 100dpi - bi-level only */ 165 T4_RESOLUTION_200_100 = 0x20, 166 /*! 200dpi x 200dpi */ 167 T4_RESOLUTION_200_200 = 0x40, 168 /*! 200dpi x 400dpi - bi-level only */ 169 T4_RESOLUTION_200_400 = 0x80, 170 /*! 300dpi x 300dpi */ 171 T4_RESOLUTION_300_300 = 0x100, 172 /*! 300dpi x 600dpi - bi-level only */ 173 T4_RESOLUTION_300_600 = 0x200, 174 /*! 400dpi x 400dpi */ 175 T4_RESOLUTION_400_400 = 0x400, 176 /*! 400dpi x 800dpi - bi-level only */ 177 T4_RESOLUTION_400_800 = 0x800, 178 /*! 600dpi x 600dpi */ 179 T4_RESOLUTION_600_600 = 0x1000, 180 /*! 600dpi x 1200dpi - bi-level only */ 181 T4_RESOLUTION_600_1200 = 0x2000, 182 /*! 1200dpi x 1200dpi */ 183 T4_RESOLUTION_1200_1200 = 0x4000 184 }; 185 186 /*! 187 Exact widths in PELs for the difference resolutions, and page widths. 188 Note: 189 The A4 widths also apply to North American letter and legal. 190 The R4 resolution widths are not supported in recent versions of T.30 191 Only images of exactly these widths are acceptable for FAX transmisson. 192 193 R4 864 pels/215mm for ISO A4, North American Letter and Legal 194 R4 1024 pels/255mm for ISO B4 195 R4 1216 pels/303mm for ISO A3 196 R8 1728 pels/215mm for ISO A4, North American Letter and Legal 197 R8 2048 pels/255mm for ISO B4 198 R8 2432 pels/303mm for ISO A3 199 R16 3456 pels/215mm for ISO A4, North American Letter and Legal 200 R16 4096 pels/255mm for ISO B4 201 R16 4864 pels/303mm for ISO A3 202 203 100 864 pels/219.46mm for ISO A4, North American Letter and Legal 204 100 1024 pels/260.10mm for ISO B4 205 100 1216 pels/308.86mm for ISO A3 206 200 1728 pels/219.46mm for ISO A4, North American Letter and Legal 207 200 2048 pels/260.10mm for ISO B4 208 200 2432 pels/308.86mm for ISO A3 209 300 2592 pels/219.46mm for ISO A4, North American Letter and Legal 210 300 3072 pels/260.10mm for ISO B4 211 300 3648 pels/308.86mm for ISO A3 212 400 3456 pels/219.46mm for ISO A4, North American Letter and Legal 213 400 4096 pels/260.10mm for ISO B4 214 400 4864 pels/308.86mm for ISO A3 215 600 5184 pels/219.46mm for ISO A4, North American Letter and Legal 216 600 6144 pels/260.10mm for ISO B4 217 600 7296 pels/308.86mm for ISO A3 218 1200 10368 pels/219.46mm for ISO A4, North American Letter and Legal 219 1200 12288 pels/260.10mm for ISO B4 220 1200 14592 pels/308.86mm for ISO A3 221 222 Note that R4, R8 and R16 widths are 5mm wider than the actual paper sizes. 223 The 100, 200, 300, 400, 600, and 1200 widths are 9.46mm, 10.1mm and 11.86mm 224 wider than the paper sizes. 225 */ 226 typedef enum 227 { 228 T4_WIDTH_100_A4 = 864, 229 T4_WIDTH_100_B4 = 1024, 230 T4_WIDTH_100_A3 = 1216, 231 T4_WIDTH_200_A4 = 1728, 232 T4_WIDTH_200_B4 = 2048, 233 T4_WIDTH_200_A3 = 2432, 234 T4_WIDTH_300_A4 = 2592, 235 T4_WIDTH_300_B4 = 3072, 236 T4_WIDTH_300_A3 = 3648, 237 T4_WIDTH_400_A4 = 3456, 238 T4_WIDTH_400_B4 = 4096, 239 T4_WIDTH_400_A3 = 4864, 240 T4_WIDTH_600_A4 = 5184, 241 T4_WIDTH_600_B4 = 6144, 242 T4_WIDTH_600_A3 = 7296, 243 T4_WIDTH_1200_A4 = 10368, 244 T4_WIDTH_1200_B4 = 12288, 245 T4_WIDTH_1200_A3 = 14592 246 } t4_image_width_t; 247 248 #define T4_WIDTH_R4_A4 T4_WIDTH_100_A4 249 #define T4_WIDTH_R4_B4 T4_WIDTH_100_B4 250 #define T4_WIDTH_R4_A3 T4_WIDTH_100_A3 251 252 #define T4_WIDTH_R8_A4 T4_WIDTH_200_A4 253 #define T4_WIDTH_R8_B4 T4_WIDTH_200_B4 254 #define T4_WIDTH_R8_A3 T4_WIDTH_200_A3 255 256 #define T4_WIDTH_R16_A4 T4_WIDTH_400_A4 257 #define T4_WIDTH_R16_B4 T4_WIDTH_400_B4 258 #define T4_WIDTH_R16_A3 T4_WIDTH_400_A3 259 260 /*! 261 Length of the various supported paper sizes, in pixels at the various Y resolutions. 262 Paper sizes are 263 A4 (210mm x 297mm) 264 B4 (250mm x 353mm) 265 A3 (297mm x 420mm) 266 North American Letter (215.9mm x 279.4mm or 8.5"x11") 267 North American Legal (215.9mm x 355.6mm or 8.4"x14") 268 Unlimited 269 270 T.4 does not accurately define the maximum number of scan lines in a page. A wide 271 variety of maximum row counts are used in the real world. It is important not to 272 set our sending limit too high, or a receiving machine might split pages. It is 273 important not to set it too low, or we might clip pages. 274 275 Values seen for standard resolution A4 pages include 1037, 1045, 1109, 1126 and 1143. 276 1109 seems the most-popular. At fine res 2150, 2196, 2200, 2237, 2252-2262, 2264, 277 2286, and 2394 are used. 2255 seems the most popular. We try to use balanced choices 278 here. 1143 pixels at 3.85/mm is 296.9mm, and an A4 page is 297mm long. 279 */ 280 typedef enum 281 { 282 /* A4 is 297mm long */ 283 T4_LENGTH_STANDARD_A4 = 1143, 284 T4_LENGTH_FINE_A4 = 2286, 285 T4_LENGTH_300_A4 = 4665, 286 T4_LENGTH_SUPERFINE_A4 = 4573, 287 T4_LENGTH_600_A4 = 6998, 288 T4_LENGTH_800_A4 = 9330, 289 T4_LENGTH_1200_A4 = 13996, 290 /* B4 is 353mm long */ 291 T4_LENGTH_STANDARD_B4 = 1359, 292 T4_LENGTH_FINE_B4 = 2718, 293 T4_LENGTH_300_B4 = 4169, 294 T4_LENGTH_SUPERFINE_B4 = 5436, 295 T4_LENGTH_600_B4 = 8338, 296 T4_LENGTH_800_B4 = 11118, 297 T4_LENGTH_1200_B4 = 16677, 298 /* A3 is 420mm long */ 299 T4_LENGTH_STANDARD_A3 = 1617, 300 T4_LENGTH_FINE_A3 = 3234, 301 T4_LENGTH_300_A3 = 4960, 302 T4_LENGTH_SUPERFINE_A3 = 6468, 303 T4_LENGTH_600_A3 = 9921, 304 T4_LENGTH_800_A3 = 13228, 305 T4_LENGTH_1200_A3 = 19842, 306 /* North American letter is 279.4mm long */ 307 T4_LENGTH_STANDARD_US_LETTER = 1075, 308 T4_LENGTH_FINE_US_LETTER = 2151, 309 T4_LENGTH_300_US_LETTER = 3300, 310 T4_LENGTH_SUPERFINE_US_LETTER = 4302, 311 T4_LENGTH_600_US_LETTER = 6700, 312 T4_LENGTH_800_US_LETTER = 8800, 313 T4_LENGTH_1200_US_LETTER = 13200, 314 /* North American legal is 355.6mm long */ 315 T4_LENGTH_STANDARD_US_LEGAL = 1369, 316 T4_LENGTH_FINE_US_LEGAL = 2738, 317 T4_LENGTH_300_US_LEGAL = 4200, 318 T4_LENGTH_SUPERFINE_US_LEGAL = 5476, 319 T4_LENGTH_600_US_LEGAL = 8400, 320 T4_LENGTH_800_US_LEGAL = 11200, 321 T4_LENGTH_1200_US_LEGAL = 16800 322 } t4_image_length_t; 323 324 enum 325 { 326 T4_SUPPORT_WIDTH_215MM = 0x01, 327 T4_SUPPORT_WIDTH_255MM = 0x02, 328 T4_SUPPORT_WIDTH_303MM = 0x04, 329 330 T4_SUPPORT_LENGTH_UNLIMITED = 0x10000, 331 T4_SUPPORT_LENGTH_A4 = 0x20000, 332 T4_SUPPORT_LENGTH_B4 = 0x40000, 333 T4_SUPPORT_LENGTH_US_LETTER = 0x80000, 334 T4_SUPPORT_LENGTH_US_LEGAL = 0x100000 335 }; 336 337 /*! Return values from the T.85 decoder */ 338 typedef enum 339 { 340 /*! More image data is needed */ 341 T4_DECODE_MORE_DATA = 0, 342 /*! Image completed successfully */ 343 T4_DECODE_OK = -1, 344 /*! The decoder has interrupted */ 345 T4_DECODE_INTERRUPT = -2, 346 /*! An abort was found in the image data */ 347 T4_DECODE_ABORTED = -3, 348 /*! A memory allocation error occurred */ 349 T4_DECODE_NOMEM = -4, 350 /*! The image data is invalid. */ 351 T4_DECODE_INVALID_DATA = -5 352 } t4_decoder_status_t; 353 354 /*! 355 T.4 FAX compression/decompression descriptor. This defines the working state 356 for a single instance of a T.4 FAX compression or decompression channel. 357 */ 358 typedef struct t4_rx_state_s t4_rx_state_t; 359 360 /*! 361 T.4 FAX compression/decompression statistics. 362 */ 363 typedef struct 364 { 365 /*! \brief The number of pages transferred so far. */ 366 int pages_transferred; 367 /*! \brief The number of pages in the file (<0 if unknown). */ 368 int pages_in_file; 369 /*! \brief The number of bad pixel rows in the most recent page. */ 370 int bad_rows; 371 /*! \brief The largest number of bad pixel rows in a block in the most recent page. */ 372 int longest_bad_row_run; 373 /*! \brief The type of image in the file page */ 374 int image_type; 375 /*! \brief The horizontal resolution of the file page in pixels per metre */ 376 int image_x_resolution; 377 /*! \brief The vertical resolution of the file page in pixels per metre */ 378 int image_y_resolution; 379 /*! \brief The number of horizontal pixels in the file page. */ 380 int image_width; 381 /*! \brief The number of vertical pixels in the file page. */ 382 int image_length; 383 /*! \brief The type of image in the exchanged page */ 384 int type; 385 /*! \brief The horizontal resolution of the exchanged page in pixels per metre */ 386 int x_resolution; 387 /*! \brief The vertical resolution of the exchanged page in pixels per metre */ 388 int y_resolution; 389 /*! \brief The number of horizontal pixels in the exchanged page. */ 390 int width; 391 /*! \brief The number of vertical pixels in the exchanged page. */ 392 int length; 393 /*! \brief The type of compression used between the FAX machines */ 394 int compression; 395 /*! \brief The size of the image on the line, in bytes */ 396 int line_image_size; 397 } t4_stats_t; 398 399 #if defined(__cplusplus) 400 extern "C" { 401 #endif 402 403 /*! \brief Prepare to receive the next page of the current document. 404 \param s The T.4 context. 405 \return zero for success, -1 for failure. */ 406 SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s); 407 408 /*! \brief Put a bit of the current document page. 409 \param s The T.4 context. 410 \param bit The data bit. 411 \return Decode status. */ 412 SPAN_DECLARE(int) t4_rx_put_bit(t4_rx_state_t *s, int bit); 413 414 /*! \brief Put a byte of the current document page. 415 \param s The T.4 context. 416 \param buf The buffer containing the chunk. 417 \param len The length of the chunk. 418 \return Decode status. */ 419 SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len); 420 421 /*! \brief Complete the reception of a page. 422 \param s The T.4 receive context. 423 \return 0 for success, otherwise -1. */ 424 SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s); 425 426 /*! \brief Set the row write handler for a T.4 receive context. 427 \param s The T.4 receive context. 428 \param handler A pointer to the handler routine. 429 \param user_data An opaque pointer passed to the handler routine. 430 \return 0 for success, otherwise -1. */ 431 SPAN_DECLARE(int) t4_rx_set_row_write_handler(t4_rx_state_t *s, t4_row_write_handler_t handler, void *user_data); 432 433 /*! \brief Set the encoding for the received data. 434 \param s The T.4 context. 435 \param encoding The encoding. 436 \return 0 for success, otherwise -1. */ 437 SPAN_DECLARE(int) t4_rx_set_rx_encoding(t4_rx_state_t *s, int encoding); 438 439 /*! \brief Set the expected width of the received image, in pixel columns. 440 \param s The T.4 context. 441 \param width The number of pixels across the image. */ 442 SPAN_DECLARE(void) t4_rx_set_image_width(t4_rx_state_t *s, int width); 443 444 /*! \brief Set the row-to-row (y) resolution to expect for a received image. 445 \param s The T.4 context. 446 \param resolution The resolution, in pixels per metre. */ 447 SPAN_DECLARE(void) t4_rx_set_y_resolution(t4_rx_state_t *s, int resolution); 448 449 /*! \brief Set the column-to-column (x) resolution to expect for a received image. 450 \param s The T.4 context. 451 \param resolution The resolution, in pixels per metre. */ 452 SPAN_DECLARE(void) t4_rx_set_x_resolution(t4_rx_state_t *s, int resolution); 453 454 /*! \brief Set the DCS information of the fax, for inclusion in the file. 455 \param s The T.4 context. 456 \param dcs The DCS information, formatted as an ASCII string. */ 457 SPAN_DECLARE(void) t4_rx_set_dcs(t4_rx_state_t *s, const char *dcs); 458 459 /*! \brief Set the sub-address of the fax, for inclusion in the file. 460 \param s The T.4 context. 461 \param sub_address The sub-address string. */ 462 SPAN_DECLARE(void) t4_rx_set_sub_address(t4_rx_state_t *s, const char *sub_address); 463 464 /*! \brief Set the identity of the remote machine, for inclusion in the file. 465 \param s The T.4 context. 466 \param ident The identity string. */ 467 SPAN_DECLARE(void) t4_rx_set_far_ident(t4_rx_state_t *s, const char *ident); 468 469 /*! \brief Set the vendor of the remote machine, for inclusion in the file. 470 \param s The T.4 context. 471 \param vendor The vendor string, or NULL. */ 472 SPAN_DECLARE(void) t4_rx_set_vendor(t4_rx_state_t *s, const char *vendor); 473 474 /*! \brief Set the model of the remote machine, for inclusion in the file. 475 \param s The T.4 context. 476 \param model The model string, or NULL. */ 477 SPAN_DECLARE(void) t4_rx_set_model(t4_rx_state_t *s, const char *model); 478 479 /*! Get the current image transfer statistics. 480 \brief Get the current transfer statistics. 481 \param s The T.4 context. 482 \param t A pointer to a statistics structure. */ 483 SPAN_DECLARE(void) t4_rx_get_transfer_statistics(t4_rx_state_t *s, t4_stats_t *t); 484 485 /*! Get the short text name of a compression format. 486 \brief Get the short text name of an encoding format. 487 \param compression The compression type. 488 \return A pointer to the string. */ 489 SPAN_DECLARE(const char *) t4_compression_to_str(int compression); 490 491 /*! Get the short text name of an image format. 492 \brief Get the short text name of an image format. 493 \param type The image format. 494 \return A pointer to the string. */ 495 SPAN_DECLARE(const char *) t4_image_type_to_str(int type); 496 497 /*! Get the short text name of an image resolution. 498 \brief Get the short text name of an image resolution. 499 \param resolution_code The image resolution code. 500 \return A pointer to the string. */ 501 SPAN_DECLARE(const char *) t4_image_resolution_to_str(int resolution_code); 502 503 /*! Get the logging context associated with a T.4 receive context. 504 \brief Get the logging context associated with a T.4 receive context. 505 \param s The T.4 receive context. 506 \return A pointer to the logging context */ 507 SPAN_DECLARE(logging_state_t *) t4_rx_get_logging_state(t4_rx_state_t *s); 508 509 /*! \brief Prepare for reception of a document. 510 \param s The T.4 context. 511 \param file The name of the file to be received. 512 \param supported_output_compressions The compression schemes supported for output to a TIFF file. 513 \return A pointer to the context, or NULL if there was a problem. */ 514 SPAN_DECLARE(t4_rx_state_t *) t4_rx_init(t4_rx_state_t *s, const char *file, int supported_output_compressions); 515 516 /*! \brief End reception of a document. Tidy up and close the file. 517 This should be used to end T.4 reception started with t4_rx_init. 518 \param s The T.4 receive context. 519 \return 0 for success, otherwise -1. */ 520 SPAN_DECLARE(int) t4_rx_release(t4_rx_state_t *s); 521 522 /*! \brief End reception of a document. Tidy up, close the file and 523 free the context. This should be used to end T.4 reception 524 started with t4_rx_init. 525 \param s The T.4 receive context. 526 \return 0 for success, otherwise -1. */ 527 SPAN_DECLARE(int) t4_rx_free(t4_rx_state_t *s); 528 529 #if defined(__cplusplus) 530 } 531 #endif 532 533 #endif 534 /*- End of file ------------------------------------------------------------*/ 535