Быстрое преобразование RGB => YUV в OpenCL

Я знаю, что следующая формула может использоваться для преобразования изображений RGB к изображениям YUV. В следующей формуле R, G, B, Y, U, V - все 8-битовые целые числа без знака, а промежуточные значения - 16-разрядные целые числа без знака.

Y = ( (  66 * R + 129 * G +  25 * B + 128) >> 8) +  16  
U = ( ( -38 * R -  74 * G + 112 * B + 128) >> 8) + 128  
V = ( ( 112 * R -  94 * G -  18 * B + 128) >> 8) + 128

Но когда формула используется в OpenCL, дело обстоит иначе.
1. Доступ для записи в 8-битную память является необязательным расширением, что означает, что некоторые реализации OpenCL могут не поддерживать его.
2. Даже указанное выше расширение поддерживается, оно смертельно медленное по сравнению с 32-битным доступом для записи.

Для повышения производительности каждые 4 пикселя будут обрабатываться одновременно, поэтому на входе будет 12 8-битных целых чисел. а на выходе - 3 32-битных целых числа без знака (первое соответствует 4 отсчетам Y, второе - 4 отсчетам U, последнее - 4 отсчетам В).

Мой вопрос - как получить эти 3 32-битные целые числа прямо из 12 8-битных целых чисел? Есть ли формула для получения этих 3 32-битных целых чисел, или мне просто нужно использовать старую формулу, чтобы получить 12 8-битных целочисленных результатов (4 Y, 4 U, 4 V) и построить 3 32-битных целых числа с битом -wise операция?

5
задан user416983 12 February 2011 в 17:39
поделиться