Improved handling of page lengths in the T.85 decoder

This commit is contained in:
Steve Underwood 2013-09-08 17:19:00 +08:00
parent 58e7db0c6d
commit b9e307c0ca
3 changed files with 49 additions and 22 deletions

View File

@ -271,11 +271,16 @@ SPAN_DECLARE(bool) t85_analyse_header(uint32_t *width, uint32_t *length, const u
return false;
*width = pack_32(&data[6]);
*length = pack_32(&data[10]);
if ((data[19] & T85_VLENGTH))
{
/* TODO: scan for a true length, if the initial one just says 0xFFFFFFFF */
/* There should be an image length sequence terminating the image later on. */
}
return true;
}
/*- End of function --------------------------------------------------------*/
static int check_bih(t85_decode_state_t *s)
static int extract_bih(t85_decode_state_t *s)
{
/* Check that the fixed parameters have the values they are expected to be
fixed at - see T.85/Table 1 */
@ -303,50 +308,68 @@ static int check_bih(t85_decode_state_t *s)
return T4_DECODE_INVALID_DATA;
}
/* P - Number of bit planes */
if (s->buffer[2] < s->min_bit_planes || s->buffer[2] > s->max_bit_planes)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. %d bit planes. Should be %d to %d.\n", s->buffer[2], s->min_bit_planes, s->max_bit_planes);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
s->bit_planes = s->buffer[2];
s->current_bit_plane = 0;
/* Now look at the stuff which actually counts in a T.85 header. */
/* XD - Horizontal image size at layer D */
s->xd = pack_32(&s->buffer[4]);
/* YD - Vertical image size at layer D */
s->yd = pack_32(&s->buffer[8]);
/* L0 - Rows per stripe, at the lowest resolution */
s->l0 = pack_32(&s->buffer[12]);
/* MX - Maximum horizontal offset allowed for AT pixel */
s->mx = s->buffer[16];
/* Options byte */
s->options = s->buffer[19];
if (s->bit_planes < s->min_bit_planes || s->bit_planes > s->max_bit_planes)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. %d bit planes. Should be %d to %d.\n", s->bit_planes, s->min_bit_planes, s->max_bit_planes);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
if (s->xd == 0 || (s->max_xd && s->xd > s->max_xd))
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Width is %" PRIu32 "\n", s->xd);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* YD - Vertical image size at layer D */
s->yd = pack_32(&s->buffer[8]);
if (s->yd == 0 || (s->max_yd && s->yd > s->max_yd))
if (s->yd == 0)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Length is %" PRIu32 "\n", s->yd);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* L0 - Rows per stripe, at the lowest resolution */
s->l0 = pack_32(&s->buffer[12]);
if (s->max_yd)
{
if ((s->options & T85_VLENGTH))
{
if (s->yd > s->max_yd)
s->yd = s->max_yd;
}
else
{
if (s->yd > s->max_yd)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Length is %" PRIu32 "\n", s->yd);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
}
}
if (s->l0 == 0)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. L0 is %" PRIu32 "\n", s->l0);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* MX - Maximum horizontal offset allowed for AT pixel */
s->mx = s->buffer[16];
if (s->mx > 127)
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. MX is %d\n", s->mx);
s->end_of_data = 2;
return T4_DECODE_INVALID_DATA;
}
/* Options byte */
s->options = s->buffer[19];
if ((s->options & 0x97))
if ((s->options & ~(T85_LRLTWO | T85_VLENGTH | T85_TPBON)))
{
span_log(&s->logging, SPAN_LOG_FLOW, "BIH invalid. Options are 0x%X\n", s->options);
s->end_of_data = 2;
@ -413,7 +436,7 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
cnt = i;
if (s->bie_len < 20)
return T4_DECODE_MORE_DATA;
if ((ret = check_bih(s)) != T4_DECODE_OK)
if ((ret = extract_bih(s)) != T4_DECODE_OK)
return ret;
/* Set up the two/three row buffer */
bytes_per_row = (s->xd + 7) >> 3;
@ -690,8 +713,8 @@ SPAN_DECLARE(int) t85_decode_put(t85_decode_state_t *s, const uint8_t data[], si
cnt += decode_pscd(s, data + cnt, len - cnt);
if (s->interrupt)
return T4_DECODE_INTERRUPT;
/* We should only have stopped processing PSCD if
we ran out of data, or hit a T82_ESC */
/* We should only have stopped processing PSCD if we ran out of data,
or hit a T82_ESC */
if (cnt < len && data[cnt] != T82_ESC)
{
s->end_of_data = 2;

View File

@ -905,12 +905,11 @@ static void process_half_baud(v17_rx_state_t *s, const complexf_t *sample)
tune_equalizer(s, &z, target);
if (++s->training_count >= V17_TRAINING_SEG_2_LEN - 48)
{
s->training_error = FP_SCALE(0.0f);
#if defined(SPANDSP_USE_FIXED_POINTx)
s->training_error = 0;
s->carrier_track_i = 100;
s->carrier_track_p = 500000;
#else
s->training_error = 0.0f;
s->carrier_track_i = 100.0f;
s->carrier_track_p = 500000.0f;
#endif

View File

@ -178,8 +178,13 @@ SPAN_DECLARE(int) v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexi16_t *
SPAN_DECLARE(int) v27ter_rx_equalizer_state(v27ter_rx_state_t *s, complexf_t **coeffs)
#endif
{
#if defined(SPANDSP_USE_FIXED_POINT)
*coeffs = NULL;
return 0;
#else
*coeffs = s->eq_coeff;
return V27TER_EQUALIZER_LEN;
#endif
}
/*- End of function --------------------------------------------------------*/