Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2017, 19:27

Часовой пояс: UTC + 5 часов



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 30 мар 2017, 22:56 
Заглядывает иногда

Зарегистрирован: 05 авг 2012, 00:36
Сообщения: 40
Делаю GIF-декодер под МК в общеобразовательных целях. Полёт был нормальным до момента, пока я не столкнулся с тем, что словарь LZW растёт и занимает всю оперативку (я разворачиваю его в стек). За пару дней курения форумов я обнаружил только то, что в случае нехватки памяти под словарь его делают кольцевым. И никакой конкретики. Я никак не могу понять - что делать, когда приходит код на старую затёртую запись словаря? Пробовал на железе - выводится мусор. Не понимаю, как оно вообще может так работать и что делать дальше. Подскажите, куда копать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 06:00 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
абсолютно не претендую на какую-либо правоту, я не знаком с устройством гифов. может и есть какие-то хитрые трюки, но интуиция подсказывает, что нельзя впихнуть невпихуемое. даже если вы будете хранить данные более оптимально и текущая проблемная картинка заработает, на какой-то другой картинке все равно места не хватит. это примерно как какой бы ни был крутой алгоритм сжатия, всегда есть блок данных, который этот алгоритм "сожмет" в бОльший размер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 16:00 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 307
Откуда: дальнее надмосковье
Вот легкий GIF loader, попробуйте, может он справится с задачей? Там, правда, в двух местах realloc используется, возможно понадобится переделать немного чтобы динамическая память не использовалась. Хотя согласен насчет "нельзя впихнуть невпихуемое", может тупо не хватить памяти для этого алгоритма.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 17:16 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
по ссылке только загрузчик хедера. Я делал полностью GIF реализацию. А зачем вам GIF?

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 18:49 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 307
Откуда: дальнее надмосковье
Oxford писал(а):
по ссылке только загрузчик хедера.

Нет же, в файле gif_load.h реализован полный декодер: декодирует гифку и вызывет вашу callback функцию для каждого кадра.

Возможно Вас смутил текст "header-only GIF loader", в данном случае имеется в виду не header гифки а что сама библиотека - headr-only (.h файл, без .c).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 19:18 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
Ага есть декодер, только там непонятно сколько потребуется ОЗУ в МК, как будут храниться картинки, как выводиться и прочее. В МК все реализуется в тесной связке с железом. Поэтому много чего доделывать нужно будет для конкретного приложения. Пока кто-то не сделает реальный пример использования с высокой эффективностью в микроконтроллерах например STM32, код так и будет сырым лежать.

В микроконтроллерах GIF практической ценности не имеет, поэтому я его до сих пор с Delphi не портировал. В GUI применять смысла нет, постоянное декодирование, накладные ресурсы на процессор, ОЗУ. Все это жрет проц и озу только в путь.
Я свой выбор остановил на BMP картинках сразу подготовленных для прямой DMA передачи в нужном режиме зависящий от дисплея. Минимальная нагрузка на процессор, высокая скорость отрисовки. Часть GUI успешно компилируется во флеш память микроконтроллера, крупные картинки можно хранить во внешней флеш.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 31 мар 2017, 21:16 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 дек 2016, 00:04
Сообщения: 145
Откуда: Россия, Москва
Vercingetorix писал(а):
Делаю GIF-декодер под МК в общеобразовательных целях. Полёт был нормальным до момента, пока я не столкнулся с тем, что словарь LZW растёт и занимает всю оперативку (я разворачиваю его в стек). За пару дней курения форумов я обнаружил только то, что в случае нехватки памяти под словарь его делают кольцевым. И никакой конкретики. Я никак не могу понять - что делать, когда приходит код на старую затёртую запись словаря? Пробовал на железе - выводится мусор. Не понимаю, как оно вообще может так работать и что делать дальше. Подскажите, куда копать.

Вы можете использовать укороченный словарь при кодировании. При декодировании такой трюк вам не поможет. Придется докупить внешней памяти или забросить идею.

_________________
http://eax.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 01:13 
Заглядывает иногда

Зарегистрирован: 05 авг 2012, 00:36
Сообщения: 40
arm999 писал(а):
Вот легкий GIF loader, попробуйте, может он справится с задачей?

В сях я не силён, пишу на ассемблере, однако спасибо за ссылку, почитаю. Может, узнаю что нового.

Oxford писал(а):
А зачем вам GIF?

Именно затем, как сказал предыдущий оратор - "впихнуть невпихуемое". Очень уж много памяти под графику уходит, а JPEG я пока не осилю.

Oxford писал(а):
В GUI применять смысла нет, постоянное декодирование, накладные ресурсы на процессор, ОЗУ. Все это жрет проц и озу только в путь.

Ну, если применять без фанатизма, то польза есть - графика жмётся раз в 10, картинки с небольшой палитрой выводятся шустро, да так, что узкое место, в основном, в SPI, а не в вычислениях. Для примера - GIF в 32 цвета размером 52х52 выводится за 25мс на 16МГц и требует 4544 байта памяти. Согласен, не быстро, но на глаз тормоза еле заметны.

afiskon писал(а):
... При декодировании такой трюк вам не поможет.

Спасибо, это я и хотел узнать.
Зато появилась идея - дробить большое изображение на много мелких, словарь то каждый раз будет новый. И сжатие будет лучше, т.к. палитры под каждый кусок будут оптимальнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 01:52 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
а кто знает, на графике типа менюшек, на сколько сжатие lzw лучше rle?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 01:54 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2189
Откуда: Санкт-Петербург
Так вам не надо произвольные файлы читать? Тогда нафиг gif, сделайте что-нибудь, что лучше ложится на ваши ограничения. Для начала хотя бы RLE, потом добавьте хафмана или арифметическое кодирование. Хотя под хафмана/арифметику можно просто добавить новый "цвет" - повтор предыдущего пиксела (а потом можно добавить повтор пиксела строкой выше).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 02:05 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2189
Откуда: Санкт-Петербург
RLE+хафман должно хватить (единственное исключение - если есть регулярные текстуры, например, типа шахматной доски, они rle собьют)

Кстати, для изображений типа одноцветных символов на одноцветном же фоне (меню ;-)) хорошо работают простейшие ppm-based кодеры. Берем три пиксела строкой выше (над нашим, чуть левее и чуть правее) и пиксел слева от него - 4 бита дают контекст. Для этого контекста считаем вероятности чёрного и белого пиксела (при сжатии посчитать табличку из 16 значений) - это входные данные для арифметического энкодера (или хаффмана). Подобный алгоритм применяется в djvu.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 02:06 
Заглядывает иногда

Зарегистрирован: 05 авг 2012, 00:36
Сообщения: 40
Ink писал(а):
а кто знает, на графике типа менюшек, на сколько сжатие lzw лучше rle?

В моём случае, LZW (GIF) даёт размер в среднем меньше в 3-4 раза, чем RLE

aamonster писал(а):
Так вам не надо произвольные файлы читать? Тогда нафиг gif, сделайте что-нибудь, что лучше ложится на ваши ограничения. Для начала хотя бы RLE, потом добавьте хафмана или арифметическое кодирование. Хотя под хафмана/арифметику можно просто добавить новый "цвет" - повтор предыдущего пиксела (а потом можно добавить повтор пиксела строкой выше).

GIF я выбрал для простоты и удобства - сделал в фотошопе картинку и сразу перегнал в массив. А создавать свой формат мне пока не по силам, так как надо писать кодировщик на ПК. А вообще - идея интересная, поразмыслю на досуге.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 04:35 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
16 мгц? Ужас. Я еще раз говорю GIF в МК бесполезная вещь, тормоза, расходы. Неправильный подход.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 08:24 
Заглядывает иногда

Зарегистрирован: 05 авг 2012, 00:36
Сообщения: 40
Oxford писал(а):
16 мгц? Ужас.
Почему ужас? Отличная частота:) К тому же, никто не мешает взять камушек по-шустрее, если потребуется.
Oxford писал(а):
Я еще раз говорю GIF в МК бесполезная вещь, тормоза, расходы. Неправильный подход.
Так я и не призываю срочно всем использовать гиф, делаю чисто из интереса. Чтоб всё самому пощупать и понять - что, как и почему.
Зачастую бывает, что процессорное время девать не куда, а памяти мало. Вот как раз на такой случай может и сгодится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 17:56 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
Щупать надо девочек ))) Процессорное время всегда есть куда девать, его вечно не хватает, особенно в отношении GUI. Нагрузить процессор не проблема, проблема не нагружать.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 18:32 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
а пнг-декодер сложнее гиф-декодера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 01 апр 2017, 18:53 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
PNG сложнее там используется ZLIB для декодирования.
Сам парсер не особо сложнее но замуты есть, там чанки используются.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 02 апр 2017, 07:48 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
ну чанки-то - тривиальная вещь. но кроме злиб еще кучка разных методов обработки данных перед сжатием (в гифе такого нет?).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 03 апр 2017, 09:26 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
Кодирование не изучал, только декодирование. у GIF там палитра, варианты наложения кадров, анимация, развертка основное. У PNG больше вариантов по кодированию.

На счет памяти. Декодеру LZW требуется, это максимальное что потребуется для работы две таблицы и стек
Table0: array[0..4095] of Word; // LZW prefix
Table1: array[0..4095] of Byte; // LZW suffix
STACK: array[0..4095] of Byte;

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 03 апр 2017, 10:32 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
12к на все случаи жизни максимум? (ну кроме самого изображения)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 03 апр 2017, 11:29 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 2852
Откуда: Кемеровская область, Киселевск
это для самого декодера LZW основные буферы, часть можно динамическими сделать, но я сделал статические максимальные. Ну мелкие переменные локальные байты, ворды не считаю. Это из крупняка что потребуется для самой распаковки кадра. А так еще таблицу можно плюсануть 256 цветов * 3 байта. Таблицу можно сделать фиксированную и не считывать если нужно. Но тогда придется кодировать со своей таблицей цветов. В фотошопе можно указать набор цветов любой. Я спецификацию GIF полностью знаю.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: GIF декодер (вопрос по LZW)
СообщениеДобавлено: 03 апр 2017, 12:06 
Заглядывает иногда

Зарегистрирован: 05 авг 2012, 00:36
Сообщения: 40
Похоже, косяк у меня. Так как словарь 12 бит - максимум 4096 записей, я пишу 4 байта на одну запись, значит, максимум 16кб памяти надо. А у меня 32, и она переполняется. Как-то я раньше не подумал. Спасибо, пойду искать баг.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB