реклама на сайте
подробности

 
 
> JPEG - Таблица квантования, Число со знаком?
DpInRock
сообщение Apr 24 2009, 14:48
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Кто вдруг сталкивался.
Цитата
5.2.2.3.1 Quantization. Quantization is accomplished by dividing each DCT coefficient value by the
quantization table value for that coefficient and rounding the result. The quantized DCT coefficient values
are signed, two's complement integers with 11-bit precision for 8-bit input precision and 15-bit precision
for 12-bit input precision.


Сие не прибавило знаний.

Иногда в таблице квантизации появляются байты с установленным старшим битом. Вот это все-таки отрицательное число, или нет?

Просто сейчас ловлю мелкие недочеты в отображении JPG. Ищу где может быть потеря точности (считаю все целочисленно).

Пытаюсь понять наличие мелких цветовых артефактов на некоторых файлах. То ли я где-то не достаточно правильно YBR в RGB перевожу (переполнения или наоборот), то ли все умирает на этапе деквантизации.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Apr 25 2009, 16:25
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Кто теперь соберется декодер джпег писать - отвечу на любые дурацкие вопросы. Заработало как надо наконец.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Dec 14 2010, 07:19
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(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;

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 06:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016