Сравнение кодеков VP8, x264 и libtheora

:

Месяц назад Google открыл спецификации формата VP8, который должен стать основным форматом видео в вебе. VP8 свободен от патентов в отличие от H.264, при этом по заявлениям разработчиков должен превзойти конкурента по качеству. На сайте компании On2 уже давно висит многообещающий график. Когда кодек появился в открытом доступе, мне стало интересно, выполнили ли они обещание.

Те сравнения, которые появились в сети после релиза, были достаточно поверхностны. Jason Garrett-Glaser, разработчик x264, также готовит своё субъективное сравнение большого количества кодеков, где будет представлен и VP8, но он его ещё пока не опубликовал.

Картинка для привлечения внимания

Так я взялся проделать своё небольшое объективное сравнение.

Готовить сравнение я начал ещё на той же неделе, на которой был релиз VP8, поэтому все кодеры примерно месячной давности.


VP8


Референсный кодер, версия от 18 мая 2010 года, собирал в VS2008 в конфигурации Release.

x264


Представителем семейства H.264 будет кодек x264 версии r1602. Думаю, многие о нём уже слышали: он бесплатен, широко доступен и является одним из передовых. Поскольку VP8 заявлен как веб-оптимизированный кодек, то разумно сравнивать его с Baseline-профайлом x264. Но я также измерил данные по High-профайлу x264, чтобы составить полную картину.
Основные отличия baseline-профайла заключаются в отсутствии b-кадров и арифметического кодирования. B-кадров у VP8 тоже нет, а вот арифметическое кодирование есть. Более подробно про профайлы H.264 можно посмотреть в Википедии.

libtheora


Интересно посмотреть, сколько мы наиграли относительно другого полностью открытого кодека. Так что в сравнении участвует новый билд Ogg Theora. Сейчас идёт разработка новой версии кодера, которую назвали Ptalarbvorm, и в сети как раз появилась демо. Билд версии ptalarbvorm-svn17230. MediaInfo его распознаёт как libtheora 1.1+ 20100314 (Ptalarbvorm).

Для декодирования результатов Теоры и x264 я использовал AviSynth-плагин FFMpegSource2 версии 2-2.13. Для декодирования VP8 — референсный декодер.

Пресеты кодеков


У всех кодеков установлен интервал между I-кадрами равный 250. Настройки выставлены под более гибкий rate control. Для x264 количество референсных кадров поставил три, так как больше не поддерживается конкурентами. VP8 настроен в соответствии с рекомендациями c сайта webmproject.org.

x264 High Profile:
--keyint 250 --bframes 4 --b-adapt 2 --b-pyramid normal --ref 3 --rc-lookahead 50 --no-psy --partitions all --8x8dct --direct auto --me umh --subme 8 --trellis 2 --no-fast-pskip

x264 Baseline Profile:
--keyint 250 --bframes 0 --ref 3 --rc-lookahead 50 --no-psy --partitions all --direct auto --me umh --subme 8 --trellis 2 --no-fast-pskip --no-cabac --profile baseline

VP8:
--good --end-usage=0 --undershoot-pct=100 -p 2 --kf-max-dist=250 --drop-frame=0 --resize-allowed=0 --static-thresh=0 --profile=0 --auto-alt-ref=1 --lag-in-frames=16

libtheora:
--soft-target --two-pass -k 250 -z 0


Для сравнения я взял четыре видеопоследовательности, две из них в SD и две в HD.

Toys and calendar



640x352, 250 кадров
Плавное движение, много деталей и сложные текстуры. Это видео мне понравилось в предыдущем сравнении, решил использовать его и в этом.

Big buck bunny



704x480, 926 кадров
Фрагмент мультфильма Big buck bunny, трёхмерная анимация. Это видео я чаще всего встречал на демках разных открытых кодеков и не мог пройти мимо =) Исходник анаморфный, то есть пропроции слегка искажены.

Battle



1280x544, 586 кадров
Фрагмент из фильма Терминатор. Очень динамичное видео, много движения, частые смены сцен.

Old town cross



1280x720, 500 кадров
Видео с плавным движением. Большое количество деталей, но есть равномерная область (небо). Также есть небольшая зернистость.
Вместо замера на одном битрейте, как в прошлый раз, сейчас я решил сделать несколько замеров на разных битрейтах. И данные по всем замерам можно представить на одном графике в виде ломаной. Диапазон изменения битрейта я подбирал за несколько проб, исходя из визуального качества результатов.
Кодирование проводил в два прохода с заданным битрейтом. Битрейт, естественно, переменный. Quality-based режима у VP8 нет, если что.
Для оценки качества использовал метрику SSIM. Как показывает практика, она ближе к результатам визуального сравнения, чем PSNR. Для измерения SSIM использовал MSU Video Quality Measurement Tool.
Кстати, у x264 есть параметр --tune ssim, который позволяет слегка улучшить показатель SSIM, просаживая при этом PSNR. Не включил этот параметр, так как я изначально хотел считать обе метрики. Но не стал, потому что объём работы удваивается, а полезность малая — результаты обычно очень похожи.
Отклонение битрейта в этот раз учтено за счёт того, что точки на график наносились в соответствии с реальным показанным битрейтом. На некоторых графиках можно заметить, что точки находятся не точно на отметке.
VP8 оказался между двумя профайлами x264, а Теора сильно от них отстала. Чтобы можно было разглядеть на графиках разницу в результатах x264 и VP8, пришлось от Теоры оставить только два-три замера на самых высоких битрейтах.
Скриншоты к результатам даю отдельными ссылками, так как куча картинок только замусорит статью. Да и рассматривать их, переключаясь между табами, всё равно удобнее.

Toys and calendar



Здесь результаты x264 и VP8 визуально отличаются незначительно. VP8 лучше сохранил текстуры, чем x264 Baseline Profile, а x264 High Profile это удалось ещё чуть лучше. У Теоры картинка сильно размыта.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

Big buck bunny



Здесь визуально VP8 оказался ненамного лучше, чем x264 BP. У них на разных сценах по-разному замылена картинка. По SSIM VP8 оказался всё-таки выше. x264 HP заметно лучше. Теора заметно хуже.

Пример типичной ситуации:
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

Пример сцены, где хорошо заметен отрыв VP8 от x264 BP.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

Ещё у VP8 бывают проблемы с распределением битрейта по видео (хотя и двухпроходное кодирование). Например вот, сама сцена статичная, только кролик двинулся, за что очень сильно пострадал. Тут даже Теора выглядит лучше. Такие штуки встречаются в порядке исключения, но встречаются.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

Battle



Несмотря на более высокие показатели SSIM у всех кодеков, результаты на этом видео визуально хуже, чем на других. В основном у VP8 картинка менее замыленная, чем у x264 BP.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

И вот ещё пример, когда VP8 сильно испоганил сцену.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP

Old town cross



На этом видео визуально отличия еле заметны. Везде смыта зернистость, замылена черепица на крышах. Основные отличия в том, насколько грубо/точно переданы мелкие детали. Ну и Теора всё размыла.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Цифры и картинки — это интересно и занимательно. Но есть ещё чисто практический вопрос: соотношение размер/качество. Есть простой способ его примерно оценить: пересечь графики результатов горизонтальной линией, фиксирующей SSIM, и посмотреть битрейт в точках пересечения. Да, это только приблизительная оценка, но она достаточно информативна. Картину происходящего она отражает, а на других видео того же типа результаты всё равно будут слегка отличаться.
В качестве уровня SSIM на каждом графике я взял самый высокий результат x264 BP. За 100% на графике относительного битрейта принял результат VP8.

По графикам видно, что битрейт (и, как следствие, размер файла) у x264 BP больше, чем у VP8, на 12-39 процентов. При этом на «настоящем» видео со сменами сцен x264 BP проиграл меньше. Выигрыш x264 HP относительно VP8 составил от 16 до 33 процентов.
Замечу ещё, что здесь счёт идёт на проценты, а не на разы, как было в случае с Теорой.
Привожу время кодирования всех последовательностей, на которых проходило тестирование.

x264 High Profile: 20 минут 12 секунд
x264 Baseline Profile: 10 минут 21 секунда
VP8: 83 минуты 59 секунд
Theora: 21 минута 59 секунд

Конфигурация: Intel Core2Duo T6670 2.2 GHz, 3 GB RAM

Тут VP8 получил огромную фору. Я не стал его подгонять под остальные, так как это ещё альфа-версия. Правда, кодер уже был оптимизирован, в том числе и за счёт SIMD-инструкций.
Отрыв можно было компенсировать за счёт увеличения у x264 параметров --ref, --bframes, --me-range и --subme. Тем самым слегка улучшить качество. Но я оставил те настройки, которыми обычно пользуюсь, из практических соображений. Заодно получил на будущее примерный ориентир для VP8 по времени.

x264 работал в два потока, Theora умеет только в один, VP8 работал тоже в одном потоке, так как разработчики рекомендуют число потоков = (число ядер CPU – 1). Но даже при идеальной многопоточности VP8 получился бы в четыре раза медленнее x264 BP. Вы готовы ждать час вместо пятнадцати минут, или четыре дня вместо одного?

Как достаточно корректно измерить скорость декодирования, я не знаю. По-хорошему, нужно тестировать несколько разных декодеров на нескольких аппаратных конфигурациях. В том числе и на мобильных устройствах. А это отдельная большая работа, для которой ещё и технические ресурсы нужны. Возможно такие замеры появятся после того, как VP8 получит более широкое распространение. А пока есть только данные разработчика x264, по которым VP8 заметно уступает. И его результатам я верю больше, чем обещаниям маркетологов On2 и Google.


Если рассматривать VP8 как кодек для веба, то он вполне удался. Качество результатов сравнимо с кодеками стандарта H.264, в плане лицензий и патентов всех устраивает, и благодаря Google он получит достаточно широкую поддержку. Youtube — отличная стартовая площадка. Chrome, Opera, Firefox — это приличная доля рынка браузеров. Плюс Adobe обещают к концу года добавить поддержку WebM в Flash, у которого инсталляционная база порядка 90%. И плюс ещё Chrome frame для пользователей IE. На мобильных устройствах поначалу тоже через Flash, потом будет и аппаратная поддержка. Непонятно, правда, чего ждать от Apple с их iPhone.

По технической части из этого сравнения видны проблемы у VP8 с rate control'ом. Испорченные сцены — следствие неправильного распределения битов по всему видео. Несмотря на то, что видео кодировалось в два прохода. И нужно заметно уменьшить время кодирования. Понятно, что это только альфа, кодек будет дорабатываться.

Насчёт патентной чистоты вопрос пока открыт. Видно будет через год-два, появятся ли претензии, и если появятся, то как они будут решены. И я не понимаю всеобщей паники вокруг royalty-free H.264 до 2016 года. Должны же MPEG-LA его продлить, зачем губить большую пользовательскую базу. Денег у компаний-разработчиков и так хватает — за счёт девайсов, которые они продают.

Кстати, VP8 вряд ли подвинет H.264 где-либо, кроме веба. В других сферах свобода от патентов не является решающим преимуществом, так что пользователи торрентов и медиаиндустрия вряд ли будут что-то менять. Хотя на torrents.ru были чудаки, которые предлагали начать клепать DVD-рипы Теорой, так как они считали, что по качеству она превосходит H.264. Также производители разных устройств для записи видео (видеокамеры, фотоаппараты, телефоны и пр.) вряд ли будут заморачиваться с новым форматом и, соответственно, аппаратной поддержкой кодирования VP8. Цифровое ТВ тоже вряд ли перейдёт на VP8, а то ведь придётся всем менять телевизоры (или STB), а телекомпаниям в придачу оборудование для кодирования (тоже вопрос аппаратной поддержки).

И хотя стандарт H.264 был принят в 2003 году, он продолжает развиваться. В 2007 и 2009 годах были приняты два расширения формата: Scalable Video Coding и Multiview Video Coding. Не уверен, что мы скоро увидим широкое использование первого, а вот второе вполне может в ближайшие годы пойти в массы, так как 3D-видео становится всё более распространённым. И здесь VP8 тоже оказывается в роли догоняющего.


Формат VP8 вполне подходит для веба. Он намного лучше Ogg Theora и сравним с H.264 по параметру размер/качество. Вопросы о патентной чистоте и скорости декодирования остаются пока открытыми. Получит ли формат распространение — это вопрос скорее коммерческого и политического успеха, нежели технического.
Выкладываю исходное видео и результаты кодирования.
Результат VP8 у меня без контейнера, raw stream. Если кто-то правильно смуксит это в матрёшку и поделится с людьми, будет здорово.
Результаты кодирования
Исходное видео