我正在应用一个 NV12 视频转换,它会随机播放视频的像素。在诸如 Google Nexus 7 2013 之类的 ARM 设备上,使用以下 C 代码在 1024x512 区域的 30fps 时性能相当糟糕:
* 在视频开始时只进行一次预处理 *
//Temporary tables for the destination
for (j = 0; j < height; j++)
for (i = 0; i < width; i++) {
toY[i][j] = j * width + i;
toUV[i][j] = j / 2 * width + ((int)(i / 2)) * 2;
}
//Temporary tables for the source
for (j = 0; j < height; j++)
for (i = 0; i < width; i++) {
fromY[i][j] = funcY(i, j) * width + funcX(i, j);
fromUV[i][j] = funcY(i, j) / 2 * width + ((int)(funcX(i, j) / 2)) * 2;
}
* 在每一帧完成的过程 *
for (j = 0; j < height; j++)
for (i = 0; i < width; i++) {
destY[ toY[i][j] ] = srcY[ fromY[i][j] ];
if ((i % 2 == 0) && (j % 2 == 0)) {
destUV[ toUV[i][j] ] = srcUV[ fromUV[i][j] ];
destUV[ toUV[i][j] + 1 ] = srcUV[ fromUV[i][j] + 1 ];
}
}
虽然只计算了一次,funcX/Y 是一个相当复杂的转换,所以优化这部分不是很容易。
有没有办法用给定的“从”表来固定在每一帧计算的双循环?