合众达DM6446开发板,想做rgb转yuv
RGB转YUV中我用查表代替了原来的乘法运算,为什么速度没有提升?
以下是在电脑端实现的核心代码,请指教。
unsigned int my_g[256] ={
0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,
8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,
16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,
24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31,
32,32,33,33,34,34,35,35,36,36,37,37,38,38,39,39,
40,40,41,41,42,42,43,43,44,44,45,45,46,46,47,47,
48,48,49,49,50,50,51,51,52,52,53,53,54,54,55,55,
56,56,57,57,58,58,59,59,60,60,61,61,62,62,63,63,
64,65,65,66,66,67,67,68,68,69,69,70,70,71,71,72,
72,73,73,74,74,75,75,76,76,77,77,78,78,79,79,80,
80,81,81,82,82,83,83,84,84,85,85,86,86,87,87,88,
88,89,89,90,90,91,91,92,92,93,93,94,94,95,95,96,
96,97,97,98,98,99,99,100,100,101,101,102,102,103,103,104,
104,105,105,106,106,107,107,108,108,109,109,110,110,111,111,112,
112,113,113,114,114,115,115,116,116,117,117,118,118,119,119,120,
120,121,121,122,122,123,123,124,124,125,125,126,126,127,127,128,};
unsigned int my_r[256] ={
0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,
4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,
8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,12,
12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,
16,16,16,17,17,17,17,18,18,18,19,19,19,19,20,20,
20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,
24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,
28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,
32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,
36,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,
41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,
45,45,45,45,46,46,46,47,47,47,47,48,48,48,48,49,
49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,
53,53,53,54,54,54,54,55,55,55,55,56,56,56,57,57,
57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,
61,61,62,62,62,62,63,63,63,63,64,64,64,64,65,65,};
…………
………….
/*#define MY(R, G, B) ((263 * R + 516 * G + 100 * B + 16384 )>>10) ///////////////////原来的公式。
#define MU(R, G, B) ((-152 * R – 298 * G + 450 * B + 131072)>>10)
#define MV(R, G, B) ((450 * R – 377 * G – 73 * B + 131072)>>10)*/
#define MY(R, G, B) (my_r[R] + my_g[G]+ my_b[B] + 16 ) /////////////用查表代替上面的乘法
#define MU(R, G, B) (-mu_r[R] – mu_g[G]+ mu_b[B] + 128)
#define MV(R, G, B) (mv_r[R] – mv_g[G]- mv_b[B] + 128)
………………
……………..
转换:
for(i=0;i<blocks;i+=4)
{
B1 = *pRGB ;
G1 = *(pRGB + 1);
R1 = *(pRGB + 2);
B2 = *(pRGB + 3);
G2 = *(pRGB + 4);
R2 = *(pRGB + 5);
pRGB = pRGB + 6;
tmp = MU(R1, G1, B1);
tmp = (tmp > 255) ? 255 : tmp;
tmp = (tmp < 0) ? 0 : tmp;
U1 = (unsigned char)tmp;
*(pYUV + i ) = U1;
tmp = MY(R1, G1, B1);
tmp = (tmp > 255) ? 255 : tmp;
tmp = (tmp < 0) ? 0 : tmp;
Y1 = (unsigned char)tmp;
*(pYUV + i +1) = Y1;
tmp = MV(R2, G2, B2);
tmp = (tmp > 255) ? 255 : tmp;
tmp = (tmp < 0) ? 0 : tmp;
V1 = (unsigned char)tmp;
*(pYUV + i +2) = V1;
tmp = MY(R2, G2, B2);
tmp = (tmp > 255) ? 255 : tmp;
tmp = (tmp < 0) ? 0 : tmp;
Y2 = (unsigned char)tmp;
*(pYUV + i +3) = Y2;
}
Chris Meng:
David,
请问你的代码是运行在DSP上还是ARM上?