// Same as above, for YCbCr surfaces void TestTextureClientYCbCr(TextureClient* client, PlanarYCbCrData& ycbcrData) { client->Lock(OpenMode::OPEN_READ_WRITE); UpdateYCbCrTextureClient(client, ycbcrData); client->Unlock(); // client serialization SurfaceDescriptor descriptor; ASSERT_TRUE(client->ToSurfaceDescriptor(descriptor)); ASSERT_EQ(descriptor.type(), SurfaceDescriptor::TSurfaceDescriptorBuffer); auto bufferDesc = descriptor.get_SurfaceDescriptorBuffer(); ASSERT_EQ(bufferDesc.desc().type(), BufferDescriptor::TYCbCrDescriptor); auto ycbcrDesc = bufferDesc.desc().get_YCbCrDescriptor(); ASSERT_EQ(ycbcrDesc.ySize(), ycbcrData.mYSize); ASSERT_EQ(ycbcrDesc.cbCrSize(), ycbcrData.mCbCrSize); ASSERT_EQ(ycbcrDesc.stereoMode(), ycbcrData.mStereoMode); // host deserialization RefPtr<TextureHost> textureHost = CreateBackendIndependentTextureHost(descriptor, nullptr, client->GetFlags()); RefPtr<BufferTextureHost> host = static_cast<BufferTextureHost*>(textureHost.get()); ASSERT_TRUE(host.get() != nullptr); ASSERT_EQ(host->GetFlags(), client->GetFlags()); // host read if (host->Lock()) { // This will work iff the compositor is not BasicCompositor ASSERT_EQ(host->GetFormat(), mozilla::gfx::SurfaceFormat::YUV); host->Unlock(); } }
already_AddRefed<gfx::DataSourceSurface> GetSurfaceForDescriptor(const SurfaceDescriptor& aDescriptor) { uint8_t* data = GetAddressFromDescriptor(aDescriptor); auto rgb = aDescriptor.get_SurfaceDescriptorBuffer().desc().get_RGBDescriptor(); uint32_t stride = ImageDataSerializer::GetRGBStride(rgb); return gfx::Factory::CreateWrappingDataSourceSurface(data, stride, rgb.size(), rgb.format()); }
already_AddRefed<TextureHost> CreateBackendIndependentTextureHost(const SurfaceDescriptor& aDesc, ISurfaceAllocator* aDeallocator, TextureFlags aFlags) { RefPtr<TextureHost> result; switch (aDesc.type()) { case SurfaceDescriptor::TSurfaceDescriptorBuffer: { const SurfaceDescriptorBuffer& bufferDesc = aDesc.get_SurfaceDescriptorBuffer(); const MemoryOrShmem& data = bufferDesc.data(); switch (data.type()) { case MemoryOrShmem::TShmem: { result = new ShmemTextureHost(data.get_Shmem(), bufferDesc.desc(), aDeallocator, aFlags); break; } case MemoryOrShmem::Tuintptr_t: { result = new MemoryTextureHost(reinterpret_cast<uint8_t*>(data.get_uintptr_t()), bufferDesc.desc(), aFlags); break; } default: MOZ_CRASH(); } break; } #ifdef XP_WIN case SurfaceDescriptor::TSurfaceDescriptorDIB: { result = new DIBTextureHost(aFlags, aDesc); break; } case SurfaceDescriptor::TSurfaceDescriptorFileMapping: { result = new TextureHostFileMapping(aFlags, aDesc); break; } #endif default: { NS_WARNING("No backend independent TextureHost for this descriptor type"); } } return result.forget(); }