2010-01-13 5 views
1

Я работаю над тем, где хочу иметь выходную опцию, чтобы перейти к наложению видео. Некоторая поддержка rgb565, если так мило, просто скопируйте данные.Быстрое rgb565 до YUV (или даже rgb565 до Y)

Если нет, мне нужно скопировать данные с конверсией, и это буфер кадров за раз. Я собираюсь попробовать несколько вещей, но я подумал, что это может быть одной из тех вещей, которые оптимисты будут увлекаться тем, что у вас есть проблема.

Здесь различные форматы YUV, которые обычно поддерживаются, были бы плоскостью Y, за которой следовали либо чередующиеся, либо отдельные плоскости UV.

Использование Linux/xv, но на уровне, с которым я имею дело, это всего лишь байты и x86.

Я собираюсь сосредоточиться на скорости за счет качества, но есть потенциально сотни различных путей, чтобы попробовать. Там где-то есть баланс.

Я посмотрел на mmx, но я не уверен, есть ли там что-нибудь полезное. Мне ничего не кажется особенно подходящим для этой задачи, и много перетасовки, чтобы все было в правильном месте в реестрах.

Пробуя грубую версию с Y = Зеленый * 0.5 + R * 0.25 + Blue * notmuch. U и V еще меньше относятся к качеству обслуживания. Вы можете избежать убийства по этим каналам.

Для простой петли.

loop: 
movzx eax,[esi] 
add esi,2 
shr eax,3 
shr al,1 
add ah,ah 
add al,ah 
mov [edi],al 
add edi,1 
dec count 
jnz loop 

конечно каждая команда зависит от того, до и слово читается не лучший, так чередованием два может получить чуток

loop: 
mov eax,[esi] 
add esi,4 
mov ebx,eax 
shr eax,3 
shr ebx,19 
add ah,ah 
add bh,bh 
add al,ah 
add bl,bh 
mov ah,bl 
mov [edi],ax 
add edi,2 
dec count 
jnz loop 

Было бы довольно легко сделать это с 4 при время, возможно, для пользы.

Может ли кто-нибудь придумать что-нибудь быстрее, лучше?

Интересным аспектом является то, подходит ли достойный компилятор к аналогичному коду.

ответ

1

Что вы действительно хотите посмотреть, я думаю, использует MMX или целые инструкции SSE для этого. Это позволит вам работать с несколькими пикселями за раз. Я предполагаю, что ваш компилятор сможет генерировать такой код, если вы укажете правильные переключатели, особенно если ваш код написан достаточно хорошо.

Что касается существующих кодов, я бы не стал беспокоиться о инструкциях чередования разных итераций, чтобы повысить производительность. Механизм выхода из строя всех процессоров x86 (за исключением Atom) и кэшей должен хорошо справляться с этим.

Edit: Если вам нужно сделать горизонтальный добавляет вы можете использовать инструкции PHADDD и PHADDW. На самом деле, если у вас есть руководство разработчика программного обеспечения Intel, вы должны найти инструкции PH*. У них может быть то, что вам нужно.

+0

Я посмотрел MMX и SSE. Я упомянул об этом в резюме. Я не мог видеть ничего особенно полезного в этом случае, потому что MMX затрудняется при выполнении горизонтальных операций. Операция, которую мне нужно выполнить, - это различные уровни умножения (или сдвига) на разных участках одного входного источника. PMADDWD - это более или менее операция, которую мне нужно выполнить, но для этого требуется получить данные на два слова, чтобы сгенерировать результат двойного слова, который затем должен быть извлечен. Я серьезно сомневаюсь, что CPU из-за порядка может значительно ускорить короткую версию этого цикла. – Lerc

+0

PHADDW и подобные инструкции SSSE3 я считаю. Это сокращает слишком много систем. Включая мой ноутбук. Все хорошие инструкции всегда просто недоступны. – Lerc

1

Достойный компилятор, учитывая, что соответствующие переключатели настраиваются для наиболее интересных вариантов процессора, почти наверняка знает намного больше о хорошем выборе и планировании инструкций x86, чем любой простой смертный!

Посмотрите на Intel(R) 64 and IA-32 Architectures Optimization Reference Manual ...

Если вы хотите получить код оптимизации вручную, хорошей стратегией может быть заставить компилятор генерировать источник сборки для вас в качестве отправной точки, а затем настроить его; до и после каждого изменения, чтобы убедиться, что вы на самом деле делаете все лучше.

+0

Это немного веры, которые у вас есть в компиляторе. Позаботьтесь, чтобы проверить это? Y = (rgb565 & 0x7ff >> 4) + (rgb565 & 0xf800) >> 11 // время обеда, так может быть неправильно :-) который в ассемблере является SHR EAX, 3; shr al, 1; Добавить ах, ах; add al, ah; И, кроме частичных регистрационных столов, довольно компактен. Мне очень любопытно, подходит ли компилятор к тому же или лучше подходит. (Я вернусь и выясню форматирование после обеда) – Lerc

+0

Слишком медленно. Кнопка редактирования исчезла. Попытка форматирования Для удобства чтения приведенный выше код был. '0x7ff >> 4) + (rgb565 & 0xf800) >> 11' и (надеюсь, то же самое, ASM) ' SHR EAX, 3; сульц, 1; add ah, ah; add al, ah' . Ну, теперь это не намного лучше: - / – Lerc