From c671f201446401cfdc7b15ca8cad4c4c9f30d2c7 Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Wed, 9 Oct 2013 13:38:34 -0700 Subject: [PATCH] Bug 919936 - Add gtests for YCbCr memory textures. r=BenWa --- gfx/tests/gtest/TestTextures.cpp | 131 ++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/gfx/tests/gtest/TestTextures.cpp b/gfx/tests/gtest/TestTextures.cpp index 8889403f4c3e..521ee8f1e24c 100644 --- a/gfx/tests/gtest/TestTextures.cpp +++ b/gfx/tests/gtest/TestTextures.cpp @@ -11,8 +11,9 @@ #include "gfx2DGlue.h" #include "gfxImageSurface.h" #include "gfxTypes.h" +#include "ImageContainer.h" +#include "mozilla/layers/YCbCrImageDataSerializer.h" -using namespace gfx; using namespace mozilla; using namespace mozilla::layers; @@ -73,6 +74,31 @@ void AssertSurfacesEqual(gfxImageSurface* surface1, } } +// Same as above, for YCbCr surfaces +void AssertYCbCrSurfacesEqual(PlanarYCbCrData* surface1, + PlanarYCbCrData* surface2) +{ + ASSERT_EQ(surface1->mYSize, surface2->mYSize); + ASSERT_EQ(surface1->mCbCrSize, surface2->mCbCrSize); + ASSERT_EQ(surface1->mStereoMode, surface2->mStereoMode); + ASSERT_EQ(surface1->mPicSize, surface2->mPicSize); + + for (int y = 0; y < surface1->mYSize.height; ++y) { + for (int x = 0; x < surface1->mYSize.width; ++x) { + ASSERT_EQ(surface1->mYChannel[y*surface1->mYStride + x*(1+surface1->mYSkip)], + surface2->mYChannel[y*surface2->mYStride + x*(1+surface2->mYSkip)]); + } + } + for (int y = 0; y < surface1->mCbCrSize.height; ++y) { + for (int x = 0; x < surface1->mCbCrSize.width; ++x) { + ASSERT_EQ(surface1->mCbChannel[y*surface1->mCbCrStride + x*(1+surface1->mCbSkip)], + surface2->mCbChannel[y*surface2->mCbCrStride + x*(1+surface2->mCbSkip)]); + ASSERT_EQ(surface1->mCrChannel[y*surface1->mCbCrStride + x*(1+surface1->mCrSkip)], + surface2->mCrChannel[y*surface2->mCbCrStride + x*(1+surface2->mCrSkip)]); + } + } +} + // Run the test for a texture client and a surface void TestTextureClientSurface(TextureClient* texture, gfxImageSurface* surface) { @@ -119,6 +145,74 @@ void TestTextureClientSurface(TextureClient* texture, gfxImageSurface* surface) host->DeallocateSharedData(); } +// Same as above, for YCbCr surfaces +void TestTextureClientYCbCr(TextureClient* client, PlanarYCbCrData& ycbcrData) { + + // client allocation + ASSERT_TRUE(client->AsTextureClientYCbCr() != nullptr); + TextureClientYCbCr* texture = client->AsTextureClientYCbCr(); + texture->AllocateForYCbCr(ToIntSize(ycbcrData.mYSize), + ToIntSize(ycbcrData.mCbCrSize), + ycbcrData.mStereoMode); + ASSERT_TRUE(client->IsAllocated()); + + // client painting + texture->UpdateYCbCr(ycbcrData); + + ASSERT_TRUE(client->Lock(OPEN_READ_ONLY)); + client->Unlock(); + + // client serialization + client->SetID(1); + SurfaceDescriptor descriptor; + ASSERT_TRUE(client->ToSurfaceDescriptor(descriptor)); + + ASSERT_NE(descriptor.type(), SurfaceDescriptor::Tnull_t); + + // host deserialization + RefPtr textureHost = CreateBackendIndependentTextureHost(client->GetID(), + descriptor, nullptr, + client->GetFlags()); + + RefPtr host = static_cast(textureHost.get()); + + ASSERT_TRUE(host.get() != nullptr); + ASSERT_EQ(host->GetFlags(), client->GetFlags()); + ASSERT_EQ(host->GetID(), client->GetID()); + + // This will work iff the compositor is not BasicCompositor + ASSERT_EQ(host->GetFormat(), mozilla::gfx::FORMAT_YUV); + + // host read + ASSERT_TRUE(host->Lock()); + + ASSERT_TRUE(host->GetFormat() == mozilla::gfx::FORMAT_YUV); + + YCbCrImageDataDeserializer yuvDeserializer(host->GetBuffer()); + ASSERT_TRUE(yuvDeserializer.IsValid()); + PlanarYCbCrData data; + data.mYChannel = yuvDeserializer.GetYData(); + data.mCbChannel = yuvDeserializer.GetCbData(); + data.mCrChannel = yuvDeserializer.GetCrData(); + data.mYStride = yuvDeserializer.GetYStride(); + data.mCbCrStride = yuvDeserializer.GetCbCrStride(); + data.mStereoMode = yuvDeserializer.GetStereoMode(); + data.mYSize = yuvDeserializer.GetYSize(); + data.mCbCrSize = yuvDeserializer.GetCbCrSize(); + data.mYSkip = 0; + data.mCbSkip = 0; + data.mCrSkip = 0; + data.mPicSize = data.mYSize; + data.mPicX = 0; + data.mPicY = 0; + + AssertYCbCrSurfacesEqual(&ycbcrData, &data); + host->Unlock(); + + // host deallocation + host->DeallocateSharedData(); +} + TEST(Layers, TextureSerialization) { // the test is run on all the following image formats gfxImageFormat formats[3] = { @@ -142,3 +236,38 @@ TEST(Layers, TextureSerialization) { // XXX - Test more texture client types. } } + +TEST(Layers, TextureYCbCrSerialization) { + RefPtr ySurface = new gfxImageSurface(gfxIntSize(400,300), gfxImageFormatA8); + RefPtr cbSurface = new gfxImageSurface(gfxIntSize(200,150), gfxImageFormatA8); + RefPtr crSurface = new gfxImageSurface(gfxIntSize(200,150), gfxImageFormatA8); + SetupSurface(ySurface.get()); + SetupSurface(cbSurface.get()); + SetupSurface(crSurface.get()); + + PlanarYCbCrData clientData; + clientData.mYChannel = ySurface->Data(); + clientData.mCbChannel = cbSurface->Data(); + clientData.mCrChannel = crSurface->Data(); + clientData.mYSize = ySurface->GetSize(); + clientData.mPicSize = ySurface->GetSize(); + clientData.mCbCrSize = cbSurface->GetSize(); + clientData.mYStride = ySurface->Stride(); + clientData.mCbCrStride = cbSurface->Stride(); + clientData.mStereoMode = STEREO_MODE_MONO; + clientData.mYSkip = 0; + clientData.mCbSkip = 0; + clientData.mCrSkip = 0; + clientData.mCrSkip = 0; + clientData.mPicX = 0; + clientData.mPicX = 0; + + RefPtr client + = new MemoryTextureClient(nullptr, + mozilla::gfx::FORMAT_YUV, + TEXTURE_FLAGS_DEFAULT); + + TestTextureClientYCbCr(client, clientData); + + // XXX - Test more texture client types. +}