Цитата(DpInRock @ Apr 25 2009, 19:25)

Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.
Декодер в принципе написан и работает, но теперь хотелось бы улучшить помехозащищённость связки кодер-декодер (оба свои).
В частности сейчас если встречается ошибка в huffman, то JPEG декододируется только до этого квадратика и дальше вылетает по ошибке.
Вопрос в том, нельзя ли создать декодер или что-то добавить в кодер, чтоб билась лишь часть изображения?
Сейчас вылетает по sequential_huffman в данном декодере:
Код
for (i=1; i<=vertical_mcus; i++)
{
for (j=1; j<=horizontal_mcus;j++)
{
last_mcu_row = (i == vertical_mcus) ? 1 : 0;
last_mcu_column = (j == horizontal_mcus) ? 1 : 0;
if ((flag == 1) && (successive_approximation_bit_position_high == 0))
clear_buffer (mcu_buffer, mcu_size);
else
copy_data (coefficient_buffer, mcu_buffer, mcu_size);
for (k=0; k<number_of_image_components_in_frame; k ++)
{
vertical_sampling_factor = jpeg_decoder_structure->vertical_sampling_factor [k];
horizontal_sampling_factor = jpeg_decoder_structure->horizontal_sampling_factor [k];
quantization_table_destination_selector = jpeg_decoder_structure ->
quantization_table_destination_selector [k];
quantization_table = jpeg_decoder_structure ->
quantization_table [quantization_table_destination_selector];
for (l=0; l<vertical_sampling_factor; l++)
{
for (m=0; m<horizontal_sampling_factor; m++)
{
if (flag)
{
tmp = sequential_huffman (jpeg_decoder_structure, mcu_buffer, k);
if (tmp != SUCCESS) return tmp;
if (sof == SOF2) copy_data (mcu_buffer, coefficient_buffer, 64);
}
idct_F (temporary_buffer, mcu_buffer, quantization_table);
}
}
}
mcu_buffer = jpeg_decoder_structure -> mcu_buffer;
copy_output400 ((void *)&mcu_buffer[0], external_image_buffer);
jpeg_decoder_structure -> restarts_to_go --;
restart_interval = jpeg_decoder_structure -> restart_interval;
if (!(last_mcu_row & last_mcu_column))
{
if (restart_interval)
{
if (jpeg_decoder_structure -> restarts_to_go == 0)
{
tmp = read_restart_marker (jpeg_decoder_structure);
if (tmp != SUCCESS) return tmp;
}
}
}
external_image_buffer += jpeg_decoder_structure -> increment1/2;
}
external_image_buffer += jpeg_decoder_structure -> increment2/2;
}
return SUCCESS;