x&0xfffffe是什么意思?

时间:2019-09-01 09:26:54

标签: android renderscript yuv rgba

在自定义YUV到RGBA渲染脚本中,我发现了我不理解的以下行:

int baseUYIndex = numTotalPixels + (y >> 1) * wIn + (x & 0xfffffe);
  • numTotalPixels为宽*高。没关系。
  • y>>1。他们为什么这样做?
  • x & 0xfffffe。他们为什么这样做?

该脚本来自customYUVToRGBAConverter

我问的原因是因为我必须首先了解转换。在下一步中,我想将Y,U和V分量旋转90度。我向here请求帮助,但没有人可以帮助。所以,我决定自己做。

1 个答案:

答案 0 :(得分:2)

查看链接代码中的注释,您可以看到此例程专用于特定类型的YUV:带有色度二次采样的YUV。

// YUV 4:2:0 planar image, with 8 bit Y samples, followed by
// interleaved V/U plane with 8bit 2x2 subsampled chroma samples

这意味着“颜色”(U / V)字节少于“亮度”(Y)字节。具体地,由原始图像中的4个像素组成的正方形将仅被一个“ U”和一个“ V”覆盖。 (但是,它有4个Y。)U和V交织到一个单独的“平面”中,该平面跟随Y平面。 Here是一个链接,它更详细地描述了相同的布置。

也请参考Wikimedia上的this图片(警告:链接的图片是略有不同的图像格式,其中U和V不会交错)。

代码分析

相关代码采用原始图像的(x,y)坐标,并计算U / V分量的数组偏移量。 (Y分量的数组偏移很容易;它只是x + y * wIn)。每个U / V对对应于原始图像中的4像素正方形;这意味着每对U / V覆盖2个相邻行中的像素。

y >> 1

此行有效地将y除以2,从而为U / V平面提供正确的行号 。乘以wIn(即图片的宽度),您将在对应于像素的U / V行的开始处向U / V平面偏移字节。

x & 0xfffffe

这等效于x - (x % 2)。换句话说,我们使x均匀。这是为了计算U / V对在U / V行中的偏移量。由于每个U / V是一个两字节对,因此我们总是希望以该对的第一个元素结尾:在这种情况下为“ U”。

您可以从这段代码中看到

uchar _u = rsGetElementAt_uchar(inputAllocation, baseUYIndex);
uchar _v = rsGetElementAt_uchar(inputAllocation, baseUYIndex + 1);

U来自计算出的偏移量处的字节; V,从下一个字节开始。

在这里,您就拥有了色度。