mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-15 13:14:03 +00:00
Start introducing some meaningful TIFF/FX stuff
This commit is contained in:
parent
01646651ab
commit
cbb28e2ae0
@ -81,6 +81,10 @@
|
|||||||
/*! The number of centimetres in one inch */
|
/*! The number of centimetres in one inch */
|
||||||
#define CM_PER_INCH 2.54f
|
#define CM_PER_INCH 2.54f
|
||||||
|
|
||||||
|
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
||||||
|
extern TIFFFieldArray tiff_fx_field_array;
|
||||||
|
#endif
|
||||||
|
|
||||||
SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding)
|
SPAN_DECLARE(const char *) t4_encoding_to_str(int encoding)
|
||||||
{
|
{
|
||||||
switch (encoding)
|
switch (encoding)
|
||||||
@ -126,17 +130,20 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
/* Prepare the directory entry fully before writing the image, or libtiff complains */
|
/* Prepare the directory entry fully before writing the image, or libtiff complains */
|
||||||
switch (t->output_encoding)
|
switch (t->output_encoding)
|
||||||
{
|
{
|
||||||
case T4_COMPRESSION_ITU_T6:
|
case T4_COMPRESSION_ITU_T4_1D:
|
||||||
output_compression = COMPRESSION_CCITT_T6;
|
default:
|
||||||
output_t4_options = 0;
|
output_compression = COMPRESSION_CCITT_T4;
|
||||||
|
output_t4_options = GROUP3OPT_FILLBITS;
|
||||||
break;
|
break;
|
||||||
case T4_COMPRESSION_ITU_T4_2D:
|
case T4_COMPRESSION_ITU_T4_2D:
|
||||||
output_compression = COMPRESSION_CCITT_T4;
|
output_compression = COMPRESSION_CCITT_T4;
|
||||||
output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING;
|
output_t4_options = GROUP3OPT_FILLBITS | GROUP3OPT_2DENCODING;
|
||||||
break;
|
break;
|
||||||
default:
|
case T4_COMPRESSION_ITU_T6:
|
||||||
output_compression = COMPRESSION_CCITT_T4;
|
output_compression = COMPRESSION_CCITT_T6;
|
||||||
output_t4_options = GROUP3OPT_FILLBITS;
|
break;
|
||||||
|
case T4_COMPRESSION_ITU_T85:
|
||||||
|
output_compression = COMPRESSION_T85;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,10 +153,21 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
case COMPRESSION_CCITT_T4:
|
case COMPRESSION_CCITT_T4:
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_T4OPTIONS, output_t4_options);
|
TIFFSetField(t->tiff_file, TIFFTAG_T4OPTIONS, output_t4_options);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
|
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
|
||||||
break;
|
break;
|
||||||
case COMPRESSION_CCITT_T6:
|
case COMPRESSION_CCITT_T6:
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_T6OPTIONS, 0);
|
TIFFSetField(t->tiff_file, TIFFTAG_T6OPTIONS, 0);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
|
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
|
||||||
|
break;
|
||||||
|
case COMPRESSION_T85:
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
TIFFSetField(t->tiff_file,
|
||||||
|
TIFFTAG_ROWSPERSTRIP,
|
||||||
|
TIFFDefaultStripSize(t->tiff_file, 0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
||||||
@ -162,21 +180,10 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
TIFFSetField(t->tiff_file, TIFFTAG_BITSPERSAMPLE, 1);
|
TIFFSetField(t->tiff_file, TIFFTAG_BITSPERSAMPLE, 1);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
|
TIFFSetField(t->tiff_file, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1);
|
TIFFSetField(t->tiff_file, TIFFTAG_SAMPLESPERPIXEL, 1);
|
||||||
if (output_compression == COMPRESSION_CCITT_T4
|
|
||||||
||
|
|
||||||
output_compression == COMPRESSION_CCITT_T6)
|
|
||||||
{
|
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_ROWSPERSTRIP, -1L);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TIFFSetField(t->tiff_file,
|
|
||||||
TIFFTAG_ROWSPERSTRIP,
|
|
||||||
TIFFDefaultStripSize(t->tiff_file, 0));
|
|
||||||
}
|
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
TIFFSetField(t->tiff_file, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
|
TIFFSetField(t->tiff_file, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB);
|
TIFFSetField(t->tiff_file, TIFFTAG_FILLORDER, FILLORDER_LSB2MSB);
|
||||||
|
/* TIFFTAG_STRIPBYTECOUNTS and TIFFTAG_STRIPOFFSETS are added automatically */
|
||||||
|
|
||||||
x_resolution = s->metadata.x_resolution/100.0f;
|
x_resolution = s->metadata.x_resolution/100.0f;
|
||||||
y_resolution = s->metadata.y_resolution/100.0f;
|
y_resolution = s->metadata.y_resolution/100.0f;
|
||||||
@ -266,6 +273,13 @@ static int set_tiff_directory_info(t4_rx_state_t *s)
|
|||||||
TIFFSetField(t->tiff_file, TIFFTAG_IMAGELENGTH, t85_decode_get_image_length(&s->decoder.t85));
|
TIFFSetField(t->tiff_file, TIFFTAG_IMAGELENGTH, t85_decode_get_image_length(&s->decoder.t85));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
||||||
|
if (s->current_page == 0)
|
||||||
|
{
|
||||||
|
/* Create a placeholder for the global parameters IFD, to be filled in later */
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_GLOBALPARAMETERSIFD, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*- End of function --------------------------------------------------------*/
|
/*- End of function --------------------------------------------------------*/
|
||||||
@ -280,15 +294,45 @@ static int open_tiff_output_file(t4_rx_state_t *s, const char *file)
|
|||||||
|
|
||||||
static int write_tiff_image(t4_rx_state_t *s)
|
static int write_tiff_image(t4_rx_state_t *s)
|
||||||
{
|
{
|
||||||
if (s->tiff.image_buffer == NULL || s->tiff.image_size <= 0)
|
t4_rx_tiff_state_t *t;
|
||||||
|
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
||||||
|
uint64_t offset;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
t = &s->tiff;
|
||||||
|
if (t->image_buffer == NULL || t->image_size <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* Set up the TIFF directory info... */
|
/* Set up the TIFF directory info... */
|
||||||
set_tiff_directory_info(s);
|
set_tiff_directory_info(s);
|
||||||
/* ...and then write the image... */
|
/* ...and then write the image... */
|
||||||
if (TIFFWriteEncodedStrip(s->tiff.tiff_file, 0, s->tiff.image_buffer, s->tiff.image_size) < 0)
|
if (TIFFWriteEncodedStrip(t->tiff_file, 0, t->image_buffer, t->image_size) < 0)
|
||||||
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", s->tiff.file);
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Error writing TIFF strip.\n", t->file);
|
||||||
/* ...then the directory entry, and libtiff is happy. */
|
/* ...then the directory entry, and libtiff is happy. */
|
||||||
TIFFWriteDirectory(s->tiff.tiff_file);
|
if (!TIFFWriteDirectory(t->tiff_file))
|
||||||
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", t->file, s->current_page);
|
||||||
|
#if defined(SPANDSP_SUPPORT_TIFF_FX)
|
||||||
|
if (s->current_page == 0)
|
||||||
|
{
|
||||||
|
if (!TIFFCreateCustomDirectory(t->tiff_file, &tiff_fx_field_array))
|
||||||
|
{
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_FAXPROFILE, PROFILETYPE_G3_FAX);
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_PROFILETYPE, FAXPROFILE_S);
|
||||||
|
TIFFSetField(t->tiff_file, TIFFTAG_VERSIONYEAR, "1998");
|
||||||
|
|
||||||
|
offset = 0;
|
||||||
|
if (!TIFFWriteCustomDirectory(t->tiff_file, &offset))
|
||||||
|
printf("Failed to write custom directory.\n");
|
||||||
|
|
||||||
|
/* Now go back and patch in the pointer to the new IFD */
|
||||||
|
if (!TIFFSetDirectory(t->tiff_file, s->current_page))
|
||||||
|
printf("Failed to set directory.\n");
|
||||||
|
if (!TIFFSetField(t->tiff_file, TIFFTAG_GLOBALPARAMETERSIFD, offset))
|
||||||
|
printf("Failed to set field.\n");
|
||||||
|
if (!TIFFWriteDirectory(t->tiff_file))
|
||||||
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", t->file, s->current_page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*- End of function --------------------------------------------------------*/
|
/*- End of function --------------------------------------------------------*/
|
||||||
@ -308,9 +352,11 @@ static int close_tiff_output_file(t4_rx_state_t *s)
|
|||||||
need to set the correct total page count associated with each page. */
|
need to set the correct total page count associated with each page. */
|
||||||
for (i = 0; i < s->current_page; i++)
|
for (i = 0; i < s->current_page; i++)
|
||||||
{
|
{
|
||||||
TIFFSetDirectory(t->tiff_file, (tdir_t) i);
|
if (!TIFFSetDirectory(t->tiff_file, (tdir_t) i))
|
||||||
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to set directory to page %d.\n", s->tiff.file, i);
|
||||||
TIFFSetField(t->tiff_file, TIFFTAG_PAGENUMBER, i, s->current_page);
|
TIFFSetField(t->tiff_file, TIFFTAG_PAGENUMBER, i, s->current_page);
|
||||||
TIFFWriteDirectory(t->tiff_file);
|
if (!TIFFWriteDirectory(t->tiff_file))
|
||||||
|
span_log(&s->logging, SPAN_LOG_WARNING, "%s: Failed to write directory for page %d.\n", s->tiff.file, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TIFFClose(t->tiff_file);
|
TIFFClose(t->tiff_file);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user