Быстрый метод копирования памяти с преобразованием - ARGB в BGR

Обзор

У меня есть изображение буфер, который мне нужно преобразовать в другой формат. Буфер исходного изображения состоит из четырех каналов, 8 бит на канал: альфа, красный, зеленый и синий. Целевой буфер состоит из трех каналов, 8 битов на канал, синего, зеленого и красного.

Итак, метод грубой силы:

// Assume a 32 x 32 pixel image
#define IMAGESIZE (32*32)

typedef struct{ UInt8 Alpha; UInt8 Red; UInt8 Green; UInt8 Blue; } ARGB;
typedef struct{ UInt8 Blue; UInt8 Green; UInt8 Red; } BGR;

ARGB orig[IMAGESIZE];
BGR  dest[IMAGESIZE];

for(x = 0; x < IMAGESIZE; x++)
{
     dest[x].Red = orig[x].Red;
     dest[x].Green = orig[x].Green;
     dest[x].Blue = orig[x].Blue;
}

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

Дополнительная информация

Каждое изображение кратно at минимум 4 пикселя. Таким образом, мы могли адресовать 16 байтов ARGB и переместить их в 12 байтов RGB на цикл. Возможно, этот факт можно использовать для ускорения работы, тем более, что он хорошо укладывается в 32-битные границы.

У меня есть доступ к OpenCL - и хотя это требует перемещения всего буфера в память графического процессора, а затем перемещения результата обратно, тот факт, что OpenCL может работать со многими частями изображения одновременно, и тот факт, что перемещение больших блоков памяти на самом деле довольно эффективно, может сделать это стоящим исследованием.

Хотя я привел пример небольших буферов выше, я действительно Я перемещаю HD-видео (1920x1080), а иногда и большие, в основном меньшие размеры, буферы, поэтому, хотя ситуация 32x32 может быть тривиальной, копирование 8,3 МБ данных изображения побайтно, действительно плохо.

Работа на процессорах Intel (Core 2 и выше), и, следовательно, существуют команды потоковой передачи и обработки данных, о существовании которых я знаю, но не знаю - возможно, было бы полезно указать, где искать специализированные инструкции по обработке данных.

Это входит в ОС X, а я использую XCode 4. Если как сборка безболезненна и очевидный путь, я в порядке, иду по этому пути, но то, что я не делал этого на этой установке раньше, заставляет меня опасаться тратить на это слишком много времени.

Псевдокод в порядке - я ' m не ищу полного решения, а просто алгоритм и объяснение любых уловок, которые могут быть не сразу понятны.

65
задан Adam Davis 6 August 2011 в 14:57
поделиться