我正在尝试从YUYV格式到YUV422p格式的排序和数组。该阵列目前看起来像:
[Y1] [CB1] [Y2] [CR1] [Y3] [CB 2] [Y4] [CR2] [Y5] [CB3] [Y6] [CR3] [Y7] [CB4] [Y8] [CR4 ] ...... [yn] [cbn + 1/2] [yn + 1] [crn + 1/2]
我需要将它排序为:
[Y1] [Y2] [Y3] [Y4] [Y5] [Y6] [Y7] [Y8] [炔] [炔+ 1]。[CB1] [CB 2] [CB3] [CB4] [ CBN + 1/2]。[CR1] [CR2] [CR3] [CR4] [CRN + 1/2]
所有的需要在一起,所有的cb在一起,所有的cr在一起。
我正在尝试尽可能高效地使用此部分并花费最少的时间。
这是我到目前为止所做的:
inline const void YUYV_to_YUV422P_1280x960( char* yuyv, char* yuv422p)
{
const unsigned int height = 960;
const unsigned int width = 1280;
int loopCount1 = height*width/2;
int loopCount2 = height*width;
char* yComponent = yuv422p;
char* cbComponent = yuv422p + loopCount2;
char* crComponent = yuv422p + loopCount1 + loopCount2;
int i;
for( i = (loopCount1 - 1); i != 0; --i )
{
cbComponent[ i ] = yuyv[ i*4 + 1 ];
crComponent[ i ] = yuyv[ i*4 + 3 ];
}
for( i = (loopCount2 -1); i != 0; --i )
{
yComponent[ i ] = yuyv[ i*2 ];
}
}
关于如何提高效率和速度的任何想法请告诉我。
答案 0 :(得分:0)
建议一如既往地衡量它,然后决定它是否足够快。如果你在3GHz PC上这样做可以节省几微秒的时间吗?
通常在这类任务中,您的内存I / O受限,因此编写它以获得最佳缓存性能非常重要。根据图像的大小和hw,最好一次处理一行图像,以便在缓存中输入输出图像行
如果您有一个现代CPU,您可以使用SSE2加速它,并同时在多个像素上执行大量这些操作。