From 7c9039629430a6e15b7b5b3b218a4c09b3cd159e Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Wed, 24 Jul 2013 02:19:40 +0800 Subject: [PATCH] More tweaks to spandsp --- libs/spandsp/src/t4_rx.c | 63 ++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/libs/spandsp/src/t4_rx.c b/libs/spandsp/src/t4_rx.c index 247b9ae726..5852de3ae6 100644 --- a/libs/spandsp/src/t4_rx.c +++ b/libs/spandsp/src/t4_rx.c @@ -663,31 +663,31 @@ SPAN_DECLARE(int) t4_rx_put_bit(t4_rx_state_t *s, int bit) SPAN_DECLARE(int) t4_rx_put(t4_rx_state_t *s, const uint8_t buf[], size_t len) { + uint8_t *buf2; + s->line_image_size += 8*len; - switch (s->metadata.compression) + + if (s->pre_encoded_len > 0) { - case T4_COMPRESSION_T4_1D: - case T4_COMPRESSION_T4_2D: - case T4_COMPRESSION_T6: - return t4_t6_decode_put(&s->decoder.t4_t6, buf, len); - case T4_COMPRESSION_T85: - case T4_COMPRESSION_T85_L0: - return t85_decode_put(&s->decoder.t85, buf, len); -#if defined(SPANDSP_SUPPORT_T88) - case T4_COMPRESSION_T88: - break; -#endif - case T4_COMPRESSION_T42_T81: - return t42_decode_put(&s->decoder.t42, buf, len); -#if defined(SPANDSP_SUPPORT_T43) - case T4_COMPRESSION_T43: - return t43_decode_put(&s->decoder.t43, buf, len); -#endif -#if defined(SPANDSP_SUPPORT_T45) - case T4_COMPRESSION_T45: - break; -#endif + if (s->pre_encoded_len < s->pre_encoded_ptr + 65536) + { + s->pre_encoded_len += 65536; + if ((buf2 = realloc(s->pre_encoded_buf, s->pre_encoded_len)) == NULL) + { + if (s->pre_encoded_buf) + free(s->pre_encoded_buf); + return -1; + } + s->pre_encoded_buf = buf2; + } + memcpy(&s->pre_encoded_buf[s->pre_encoded_ptr], buf, len); + s->pre_encoded_ptr += len; + return T4_DECODE_MORE_DATA; } + + if (s->image_put_handler) + return s->image_put_handler((void *) &s->decoder, buf, len); + return T4_DECODE_OK; } /*- End of function --------------------------------------------------------*/ @@ -977,31 +977,42 @@ SPAN_DECLARE(int) t4_rx_start_page(t4_rx_state_t *s) switch (s->metadata.compression) { + case 0: + s->pre_encoded_ptr = 0; + s->pre_encoded_len = 0; + s->image_put_handler = NULL; + break; case T4_COMPRESSION_T4_1D: case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T6: t4_t6_decode_restart(&s->decoder.t4_t6, s->metadata.image_width); + s->image_put_handler = (t4_image_put_handler_t) t4_t6_decode_put; break; case T4_COMPRESSION_T85: case T4_COMPRESSION_T85_L0: t85_decode_restart(&s->decoder.t85); + s->image_put_handler = (t4_image_put_handler_t) t85_decode_put; break; #if defined(SPANDSP_SUPPORT_T88) case T4_COMPRESSION_T88: t88_decode_restart(&s->decoder.t88); + s->image_put_handler = (t4_image_put_handler_t) t88_decode_put; break; #endif case T4_COMPRESSION_T42_T81: t42_decode_restart(&s->decoder.t42); + s->image_put_handler = (t4_image_put_handler_t) t42_decode_put; break; #if defined(SPANDSP_SUPPORT_T43) case T4_COMPRESSION_T43: t43_decode_restart(&s->decoder.t43); + s->image_put_handler = (t4_image_put_handler_t) t43_decode_put; break; #endif #if defined(SPANDSP_SUPPORT_T45) case T4_COMPRESSION_T45: t45_decode_restart(&s->decoder.t45); + s->image_put_handler = (t4_image_put_handler_t) t45_decode_put; break; #endif } @@ -1041,27 +1052,25 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s) int length; length = 0; + if (s->image_put_handler) + s->image_put_handler((void *) &s->decoder, NULL, 0); switch (s->metadata.compression) { case T4_COMPRESSION_T4_1D: case T4_COMPRESSION_T4_2D: case T4_COMPRESSION_T6: - t4_t6_decode_put(&s->decoder.t4_t6, NULL, 0); length = t4_t6_decode_get_image_length(&s->decoder.t4_t6); break; case T4_COMPRESSION_T85: case T4_COMPRESSION_T85_L0: - t85_decode_put(&s->decoder.t85, NULL, 0); length = t85_decode_get_image_length(&s->decoder.t85); break; #if defined(SPANDSP_SUPPORT_T88) case T4_COMPRESSION_T88: - t88_decode_put(&s->decoder.t88, NULL, 0); length = t88_decode_get_image_length(&s->decoder.t88); break; #endif case T4_COMPRESSION_T42_T81: - t42_decode_put(&s->decoder.t42, NULL, 0); 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); @@ -1070,13 +1079,11 @@ SPAN_DECLARE(int) t4_rx_end_page(t4_rx_state_t *s) break; #if defined(SPANDSP_SUPPORT_T43) case T4_COMPRESSION_T43: - t43_decode_put(&s->decoder.t43, NULL, 0); length = t43_decode_get_image_length(&s->decoder.t43); break; #endif #if defined(SPANDSP_SUPPORT_T45) case T4_COMPRESSION_T45: - t45_decode_put(&s->decoder.t45, NULL, 0); length = t45_decode_get_image_length(&s->decoder.t45); break; #endif