Theora глазами имплементирующего.

Пришло время имплементировать видеокодек в движок. Выбрали Theora/Vorbis/Ogg как бесплатную со всех сторон. Расскажу о процессе….

Первое на что натыкаешься – на настойчивое предложение выставить макрос TH_REALLY_NO_ASSEMBLY, потому как asm вставки сделаны на gcc. Автор там пишет (вольный перевод) – “Я бы написал на интристиках, но вот gcc интристики понимает с трудом, и код генерирует препоганейший. А кто хочет скомпилировать под windows используйте gcc cygwin”. Странно, но у других оно компилируется без проблемм????

Второе на что натыкаешься – выходной формат у кодека это YUV4 . Вобщем тоже нестрашно, хотя тут тоже набил шишку. Попробовал написать код YUV4->RGB на CPU MMX. К сожалению тут нас подстерегает косяк. Всё декодирование Theora по скорости лишь немного быстрее, чем операция YUV4->RGB. Пока были ролики размером 512×288 и всё декодирование занимало 5-7% процессорного времени одного ядра на Core 2.6 Hhz, можно было радоваться.

Но ведь хочется большего, например HDTV. HDTV кстати тоже интересная тема. Начну с того, что ролики которые видел – они все 1440×1080 и масштабируются в 1920×1080. Тут уже код на CPU MMX ни катит никак, так как получаем больше 100% загрузки при декодировании. На помощь приходит GPU с его шейдерами, что позволяет снизить загрузку процессора до 35-65%.

Есть ещё весёлое место – seek по файлику. Недокументированное нихрена, но у нас есть mplayer и ffmpeg исходниках. Смотрим внутрь – метод деления пополам :) Косяк в том, что по отзывам падает изредка.

Вот собственно и все. К TH_REALLY_NO_ASSEMBLY интересно было бы вернуться.

UPDATE

Скомпилировал с использованием ASM вставок. Оказалось что Visual Studio отлично понимает .o и .a файлы, которые создаёт CygWin gcc. Скорость возросла на 30-40% что приятно.

  • http://kss.livejournal.com/ Joes

    Мы вот ДивX’ом мучались в свое время. Он тоже любит падать, причем иногда, причем на старте видео. Так и не побороли. Да и цена немного не соответствует количеству денюжек, которые за него просят.
    PC, ДивX который Гейминг SDK.

  • Dront

    Альфа-версия теоры компилилась без проблем, gcc ассемблера в ней не было, и тормозила она жутко.
    Текущая версия (бета) с ассемблером работает быстро. Но собирать либу приходится, таки да, gcc. Собранное – линковать с проектом. Там тоже есть подводные грабли и веселые места, но в результате – оно работает.

  • Aliot

    2Balmer
    А Unwrap-то побежден? Интересуюсь!

  • Balmer

    Неее, unwrap отложен в долгий ящик. То есть собственно куски он генерирует вполне прилично. Но вот алгоритм паковки в текстуру отвратительный. Там работы ещё по моим оценкам недели на две :(

  • Aliot

    Ой!
    А куски – нормально, да? И не самопересекающиеся? А насколько код “отчуждаем”?

    А то у нас в текстуру пакуется неплохо!
    Да и куски генерит неплохо, но через одно место :(.

  • lordmaze

    А можно глупый вопрос – а почему theora а не скажем Bink ? Те я так понял что стоимость получается в итоге одинаковая – но у бинка и саппорт и там подопытных кроликов много :)

  • Balmer

    Theora она бесплатная. Саппорт это конечно хорошо, но видать у меня менталитет не тот. Сталкивался с Bink в 2006 году (может изменилось с того времени чтото, но хз). Так вот: У bink отличный програмный интерфейс, пожалуй лучший что видел. Но вот качество/битрейт у него чуть лучше чем у mpeg2. Скорость кодирования отвратительно медленная. Скорость декодирования отличная. Ноооо, опять же – качество.

  • lordmaze

    > Theora она бесплатная.

    я так понял что некоторое время убивается то чтобы банально вставить ее в проект и заставить работать. те бинк – 10 минут, теора – месяц. Все прелести бесплатности сходят на нет.