如何将位U与YUV格式的位V交换

时间:2016-06-21 11:40:57

标签: image-processing yuv fourcc

我想从YU12

交换YUV格式的U和V位
YYYYYYYY UVUV // each letter presents a bit

到NV21

YYYYYYYY VUVU

我单独留下Y平面,并通过下面的函数处理U和V平面

uchar swap(uchar in) {
    uchar out = ((in >> 1) & 0x55) | ((in << 1) & 0xaa);
    return out;
}

但是我无法得到理想的结果,输出图像的颜色仍然不正确。

如何正确交换U和V平面?

2 个答案:

答案 0 :(得分:0)

发现问题。 UV应该以字节格式操作,而不是位。

    byte[] yuv = // ...
    final int length = yuv.length;
    for (int i1 = 0; i1 < length; i1 += 2) {
        if (i1 >= width * height) {
            byte tmp = yuv[i1];
            yuv[i1] = yuv[i1+1];
            yuv[i1+1] = tmp;
        }
    }

答案 1 :(得分:0)

尝试此方法(-_-)

    IFrameCallback iFrameCallback = new IFrameCallback() {
    @Override
    public void onFrame(ByteBuffer frame) {
        //get nv12 data
        byte[] b = new byte[frame.remaining()];
        frame.get(b);
        //nv12 data to nv21
        NV12ToNV21(b, 1280, 720);
        //send NV21 data
        BVPU.InputVideoData(nv21, nv21.length,
                System.currentTimeMillis() * 1000, 1280, 720);
    }
};

byte[] nv21;
private void NV12ToNV21(byte[] data, int width, int height) {
    nv21 = new byte[data.length];

    int framesize = width * height;
    int i = 0, j = 0;
    System.arraycopy(data, 0, nv21, 0, framesize);
    for (i = 0; i < framesize; i++) {
        nv21[i] = data[i];
    }
    for (j = 0; j < framesize / 2; j += 2) {
        nv21[framesize + j - 1] = data[j + framesize];
    }
    for (j = 0; j < framesize / 2; j += 2) {
        nv21[framesize + j] = data[j + framesize - 1];
    }
}