blob: f5f01fb85e151c1ef836a409221067bf9d2fed9c [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/gpu/chromeos/fourcc.h"
#include "base/logging.h"
#include "media/gpu/buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#if BUILDFLAG(USE_V4L2_CODEC)
#include <linux/videodev2.h>
#endif // BUILDFLAG(USE_V4L2_CODEC)
#if BUILDFLAG(USE_VAAPI)
#include <va/va.h>
#endif // BUILDFLAG(USE_VAAPI)
namespace media {
#if BUILDFLAG(USE_V4L2_CODEC)
TEST(FourccTest, V4L2PixFmtToVideoPixelFormat) {
EXPECT_EQ(PIXEL_FORMAT_NV12,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_NV12).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_NV12,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_NV12M).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_NV12,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_MT21C).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_NV12,
Fourcc::FromV4L2PixFmt(ComposeFourcc('M', 'M', '2', '1'))
.ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_I420,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YUV420).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_I420,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YUV420M).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_YV12,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YVU420).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_YV12,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YVU420M).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_I422,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_YUV422M).ToVideoPixelFormat());
// Noted that previously in V4L2Device::V4L2PixFmtToVideoPixelFormat(),
// V4L2_PIX_FMT_RGB32 maps to PIXEL_FORMAT_ARGB. However, the mapping was
// wrong. It should be mapped to PIXEL_FORMAT_BGRA.
EXPECT_EQ(PIXEL_FORMAT_BGRA,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_RGB32).ToVideoPixelFormat());
// Randomly pick an unmapped v4l2 fourcc.
#if DCHECK_IS_ON()
EXPECT_DEATH(
{ Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_Z16).ToVideoPixelFormat(); },
"Unmapped V4L2PixFmt: Z16");
#else // DCHECK_IS_ON()
EXPECT_EQ(PIXEL_FORMAT_UNKNOWN,
Fourcc::FromV4L2PixFmt(V4L2_PIX_FMT_Z16).ToVideoPixelFormat());
#endif // DCHECK_IS_ON()
}
TEST(FourccTest, VideoPixelFormatToV4L2PixFmt) {
EXPECT_EQ(
V4L2_PIX_FMT_NV12,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_NV12, true).ToV4L2PixFmt());
EXPECT_EQ(
V4L2_PIX_FMT_NV12M,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_NV12, false).ToV4L2PixFmt());
EXPECT_EQ(
V4L2_PIX_FMT_YUV420,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_I420, true).ToV4L2PixFmt());
EXPECT_EQ(
V4L2_PIX_FMT_YUV420M,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_I420, false).ToV4L2PixFmt());
EXPECT_EQ(
V4L2_PIX_FMT_YVU420,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_YV12, true).ToV4L2PixFmt());
EXPECT_EQ(
V4L2_PIX_FMT_YVU420M,
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_YV12, false).ToV4L2PixFmt());
}
#endif // BUILDFLAG(USE_V4L2_CODEC)
#if BUILDFLAG(USE_VAAPI)
TEST(FourccTest, VAFourCCToVideoPixelFormat) {
EXPECT_EQ(PIXEL_FORMAT_I420,
Fourcc::FromVAFourCC(VA_FOURCC_I420).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_NV12,
Fourcc::FromVAFourCC(VA_FOURCC_NV12).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_NV21,
Fourcc::FromVAFourCC(VA_FOURCC_NV21).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_YV12,
Fourcc::FromVAFourCC(VA_FOURCC_YV12).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_YUY2,
Fourcc::FromVAFourCC(VA_FOURCC_YUY2).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_ABGR,
Fourcc::FromVAFourCC(VA_FOURCC_RGBA).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_XBGR,
Fourcc::FromVAFourCC(VA_FOURCC_RGBX).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_ARGB,
Fourcc::FromVAFourCC(VA_FOURCC_BGRA).ToVideoPixelFormat());
EXPECT_EQ(PIXEL_FORMAT_XRGB,
Fourcc::FromVAFourCC(VA_FOURCC_BGRX).ToVideoPixelFormat());
}
TEST(FourccTest, VideoPixelFormatToVAFourCC) {
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_I420),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_I420).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_NV12),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_NV12).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_NV21),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_NV21).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_YV12),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_YV12).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_YUY2),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_YUY2).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_RGBA),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_ABGR).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_RGBX),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_XBGR).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_BGRA),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_ARGB).ToVAFourCC());
EXPECT_EQ(static_cast<uint32_t>(VA_FOURCC_BGRX),
Fourcc::FromVideoPixelFormat(PIXEL_FORMAT_XRGB).ToVAFourCC());
}
#endif // BUILDFLAG(USE_VAAPI)
} // namespace media