bool AutoLockYCbCrClient::Update(PlanarYCbCrImage* aImage) { MOZ_ASSERT(aImage); MOZ_ASSERT(mDescriptor); const PlanarYCbCrImage::Data *data = aImage->GetData(); NS_ASSERTION(data, "Must be able to retrieve yuv data from image!"); if (!data) { return false; } if (!EnsureTextureClient(aImage)) { return false; } ipc::Shmem& shmem = mDescriptor->get_YCbCrImage().data(); ShmemYCbCrImage shmemImage(shmem); if (!shmemImage.CopyData(data->mYChannel, data->mCbChannel, data->mCrChannel, data->mYSize, data->mYStride, data->mCbCrSize, data->mCbCrStride, data->mYSkip, data->mCbSkip)) { NS_WARNING("Failed to copy image data!"); return false; } return true; }
bool ImageClientSingle::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlags) { AutoLockImage autoLock(aContainer); Image *image = autoLock.GetImage(); if (!image) { return false; } if (mLastPaintedImageSerial == image->GetSerial()) { return true; } if (image->GetFormat() == PLANAR_YCBCR) { EnsureTextureClient(TEXTURE_YCBCR); PlanarYCbCrImage* ycbcr = static_cast<PlanarYCbCrImage*>(image); if (ycbcr->AsSharedPlanarYCbCrImage()) { AutoLockTextureClient lock(mTextureClient); SurfaceDescriptor sd; if (!ycbcr->AsSharedPlanarYCbCrImage()->ToSurfaceDescriptor(sd)) { return false; } if (IsSurfaceDescriptorValid(*lock.GetSurfaceDescriptor())) { GetForwarder()->DestroySharedSurface(lock.GetSurfaceDescriptor()); } *lock.GetSurfaceDescriptor() = sd; } else { AutoLockYCbCrClient clientLock(mTextureClient); if (!clientLock.Update(ycbcr)) { NS_WARNING("failed to update TextureClient (YCbCr)"); return false; } } } else if (image->GetFormat() == SHARED_TEXTURE) { EnsureTextureClient(TEXTURE_SHARED_GL_EXTERNAL); SharedTextureImage* sharedImage = static_cast<SharedTextureImage*>(image); const SharedTextureImage::Data *data = sharedImage->GetData(); SharedTextureDescriptor texture(data->mShareType, data->mHandle, data->mSize, data->mInverted); mTextureClient->SetDescriptor(SurfaceDescriptor(texture)); } else if (image->GetFormat() == SHARED_RGB) { EnsureTextureClient(TEXTURE_SHMEM); nsIntRect rect(0, 0, image->GetSize().width, image->GetSize().height); UpdatePictureRect(rect); AutoLockTextureClient lock(mTextureClient); SurfaceDescriptor desc; if (!static_cast<SharedRGBImage*>(image)->ToSurfaceDescriptor(desc)) { return false; } mTextureClient->SetDescriptor(desc); } else { nsRefPtr<gfxASurface> surface = image->GetAsSurface(); MOZ_ASSERT(surface); EnsureTextureClient(TEXTURE_SHMEM); nsRefPtr<gfxPattern> pattern = new gfxPattern(surface); pattern->SetFilter(mFilter); AutoLockShmemClient clientLock(mTextureClient); if (!clientLock.Update(image, aContentFlags, pattern)) { NS_WARNING("failed to update TextureClient"); return false; } } Updated(); if (image->GetFormat() == PLANAR_YCBCR) { PlanarYCbCrImage* ycbcr = static_cast<PlanarYCbCrImage*>(image); UpdatePictureRect(ycbcr->GetData()->GetPictureRect()); } mLastPaintedImageSerial = image->GetSerial(); aContainer->NotifyPaintedImage(image); return true; }