for (int h = 0; h < height; h++) {
for (int w = 0; w < lineDataSize; w += 3) {
mirrorBgr24[lineStartIndex + w] = bgr24[lineStartIndex + lineDataSize - w - 3];
mirrorBgr24[lineStartIndex + w + 1] = bgr24[lineStartIndex + lineDataSize - w - 2];
mirrorBgr24[lineStartIndex + w + 2] = bgr24[lineStartIndex + lineDataSize - w - 1];
}
lineStartIndex += lineDataSize;
}
}
- 垂直镜像
void verticalMirrorBgr24(char *bgr24, char *mirrorBgr24, int width, int height) {
int lineDataSize = width * 3;
bgr24 += width * height * 3;
for (int h = 0; h < height; h++) {
memcpy(mirrorBgr24, bgr24, lineDataSize);
mirrorBgr24 += lineDataSize;
bgr24 -= lineDataSize;
}
}
由于NV21和NV12的结构只是UV数据位置相反,因此镜像NV21的代码同样适用于镜像NV12。
- 水平镜像
void horizontalMirrorNv21(char *nv21, char *mirrorNv21, int width, int height) {
int yLineStartIndex = 0;
int uvLineStartIndex = width * height;
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w += 2) {
mirrorNv21[yLineStartIndex + w] = nv21[yLineStartIndex + width - w];
mirrorNv21[yLineStartIndex + w + 1] = nv21[yLineStartIndex + width - w - 1];
if ((h & 1) == 0) {
mirrorNv21[uvLineStartIndex + w] = nv21[uvLineStartIndex + width - w];
mirrorNv21[uvLineStartIndex + w + 1] = nv21[uvLineStartIndex + width - w - 1];