From e689ae60dafcc5db6a7266906f38410f0d6f3e24 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 8 Oct 2015 19:12:24 +0300 Subject: Add support for YVYU and VYUY --- libkms++/dumbframebuffer.cpp | 2 ++ libkms++/pixelformats.h | 4 ++++ libkmstest/testpat.cpp | 53 +++++++++++++++++++++++++++----------------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/libkms++/dumbframebuffer.cpp b/libkms++/dumbframebuffer.cpp index cb815da..f422081 100644 --- a/libkms++/dumbframebuffer.cpp +++ b/libkms++/dumbframebuffer.cpp @@ -55,6 +55,8 @@ static const map format_info_array = { /* YUV packed */ { PixelFormat::UYVY, { 1, { { 32, 2, 1 } }, } }, { PixelFormat::YUYV, { 1, { { 32, 2, 1 } }, } }, + { PixelFormat::YVYU, { 1, { { 32, 2, 1 } }, } }, + { PixelFormat::VYUY, { 1, { { 32, 2, 1 } }, } }, /* YUV semi-planar */ { PixelFormat::NV12, { 2, { { 8, 1, 1, }, { 16, 2, 2 } }, } }, /* RGB16 */ diff --git a/libkms++/pixelformats.h b/libkms++/pixelformats.h index 6741ea4..4432cac 100644 --- a/libkms++/pixelformats.h +++ b/libkms++/pixelformats.h @@ -11,8 +11,12 @@ enum class PixelFormat : uint32_t { NV12 = MakeFourCC("NV12"), NV21 = MakeFourCC("NV21"), + UYVY = MakeFourCC("UYVY"), YUYV = MakeFourCC("YUYV"), + YVYU = MakeFourCC("YVYU"), + VYUY = MakeFourCC("VYUY"), + XRGB8888 = MakeFourCC("XR24"), XBGR8888 = MakeFourCC("XB24"), RGB565 = MakeFourCC("RG16"), diff --git a/libkmstest/testpat.cpp b/libkmstest/testpat.cpp index f621b91..5c67660 100644 --- a/libkmstest/testpat.cpp +++ b/libkmstest/testpat.cpp @@ -40,6 +40,9 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color) break; } case PixelFormat::UYVY: + case PixelFormat::YUYV: + case PixelFormat::YVYU: + case PixelFormat::VYUY: { if ((x & 1) == 0) { c1 = color; @@ -51,28 +54,38 @@ static void draw_pixel(DumbFramebuffer& buf, unsigned x, unsigned y, RGB color) YUV yuv1 = c1.yuv(); YUV yuv2 = color.yuv(); - p[0] = (yuv1.u + yuv2.u) / 2; - p[1] = yuv1.y; - p[2] = (yuv1.v + yuv2.v) / 2; - p[3] = yuv2.y; - break; - } - case PixelFormat::YUYV: - { - if ((x & 1) == 0) { - c1 = color; - return; + switch (buf.format()) { + case PixelFormat::UYVY: + p[0] = (yuv1.u + yuv2.u) / 2; + p[1] = yuv1.y; + p[2] = (yuv1.v + yuv2.v) / 2; + p[3] = yuv2.y; + break; + + case PixelFormat::YUYV: + p[0] = yuv1.y; + p[1] = (yuv1.u + yuv2.u) / 2; + p[2] = yuv2.y; + p[3] = (yuv1.v + yuv2.v) / 2; + break; + + case PixelFormat::YVYU: + p[0] = yuv1.y; + p[1] = (yuv1.v + yuv2.v) / 2; + p[2] = yuv2.y; + p[3] = (yuv1.u + yuv2.u) / 2; + break; + + case PixelFormat::VYUY: + p[0] = (yuv1.v + yuv2.v) / 2; + p[1] = yuv1.y; + p[2] = (yuv1.u + yuv2.u) / 2; + p[3] = yuv2.y; + break; + default: + break; } - uint8_t *p = (uint8_t*)(buf.map(0) + buf.stride(0) * y + x * 2); - - YUV yuv1 = c1.yuv(); - YUV yuv2 = color.yuv(); - - p[0] = yuv1.y; - p[1] = (yuv1.u + yuv2.u) / 2; - p[2] = yuv2.y; - p[3] = (yuv1.v + yuv2.v) / 2; break; } default: -- cgit v1.2.3