mirror of https://github.com/status-im/qzxing.git
QZXingFilter: add YUV420P format support
This commit is contained in:
parent
46c8ab94f0
commit
fe1337394e
|
@ -153,6 +153,28 @@ void QZXingFilterRunnable::processVideoFrameProbed(SimpleVideoFrame & videoFrame
|
||||||
if(image.isNull() && videoFrame.pixelFormat == QVideoFrame::Format_BGR24)
|
if(image.isNull() && videoFrame.pixelFormat == QVideoFrame::Format_BGR24)
|
||||||
image = QImage((uchar*)videoFrame.data.data(), videoFrame.size.width(), videoFrame.size.height(), QImage::Format_RGB888);
|
image = QImage((uchar*)videoFrame.data.data(), videoFrame.size.width(), videoFrame.size.height(), QImage::Format_RGB888);
|
||||||
|
|
||||||
|
if(image.isNull() && videoFrame.pixelFormat == QVideoFrame::Format_YUV420P) {
|
||||||
|
image = QImage(videoFrame.size, QImage::Format_RGB32);
|
||||||
|
const uchar *data = (uchar*) videoFrame.data.data();
|
||||||
|
const int width = image.width();
|
||||||
|
const int height = image.height();
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x = 0; x < width; x++) {
|
||||||
|
const uchar Y = data[y * width + x];
|
||||||
|
const uchar U = data[y * width / 4 + x / 2 + width * height];
|
||||||
|
const uchar V = data[y * width / 4 + x / 2 + width * height * 5 / 4];
|
||||||
|
const int C = (int) Y - 16;
|
||||||
|
const int D = (int) U - 128;
|
||||||
|
const int E = (int) V - 128;
|
||||||
|
image.setPixel(x, y, qRgb(
|
||||||
|
qBound(0, (298 * C + 409 * E + 128) >> 8, 255),
|
||||||
|
qBound(0, (298 * C - 100 * D - 208 * E + 128) >> 8, 255),
|
||||||
|
qBound(0, (298 * C + 516 * D + 128) >> 8, 255)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// TODO: Handle (create QImages from) YUV formats.
|
/// TODO: Handle (create QImages from) YUV formats.
|
||||||
|
|
||||||
if(image.isNull())
|
if(image.isNull())
|
||||||
|
|
Loading…
Reference in New Issue