Я работаю над тем, что я хочу, чтобы у меня была опция вывода, чтобы перейти к наложению видео. Некоторая поддержка rgb565, если так мило, просто скопируйте данные.
Если нет, мне нужно скопировать данные с помощью преобразования, и это буфер кадров за раз. Я собираюсь попробовать несколько вещей, но я подумал, что это может быть одной из тех вещей, на которые оптимизаторы будут стремиться попробовать себя.
Существует множество форматов YUV, которые обычно поддерживаются проще всего: это плоскость Y, за которой следуют либо чередующиеся, либо отдельные плоскости UV.
Использование Linux / xv, но на уровне, с которым я имею дело, это всего лишь байты и x86.
Я собираюсь сосредоточиться на скорости за счет качества, но потенциально есть сотни различных путей, чтобы попробовать. Там где-то есть баланс.
Я посмотрел на mmx, но я не уверен, есть ли там что-нибудь полезное. Нет ничего, что могло бы мне показаться особенно подходящим для этой задачи, и было бы очень трудно перетаскивать вещи в нужное место в регистрах.
Попытка сырой версии с Y = Зеленый * 0,5 + R * 0,25 + Синий * не очень. 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 за раз, возможно, для выгоды.
Может кто-нибудь придумать что-нибудь быстрее, лучше?
Интересно отметить, может ли приличный компилятор создавать похожий код.