Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Unified Diff: src/gpu/GrYUVProvider.cpp

Issue 1716523002: Update Skia's YUV API (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrYUVProvider.cpp
diff --git a/src/gpu/GrYUVProvider.cpp b/src/gpu/GrYUVProvider.cpp
index 844849a57567360157fe14b172291a276d4288d1..4102795c8f1fefdbd42e3fc1ceb586b78a0e9e65 100644
--- a/src/gpu/GrYUVProvider.cpp
+++ b/src/gpu/GrYUVProvider.cpp
@@ -40,22 +40,21 @@ bool YUVScoper::init(GrYUVProvider* provider, SkYUVPlanesCache::Info* yuvInfo, v
if (fCachedData.get()) {
planes[0] = (void*)fCachedData->data();
- planes[1] = (uint8_t*)planes[0] + yuvInfo->fSizeInMemory[0];
- planes[2] = (uint8_t*)planes[1] + yuvInfo->fSizeInMemory[1];
+ planes[1] = (uint8_t*)planes[0] +
+ (yuvInfo->fSizeInfo.fYWidthBytes * yuvInfo->fSizeInfo.fYSize.fHeight);
+ planes[2] = (uint8_t*)planes[1] +
+ (yuvInfo->fSizeInfo.fUWidthBytes * yuvInfo->fSizeInfo.fUSize.fHeight);
} else {
- // Fetch yuv plane sizes for memory allocation. Here, width and height can be
- // rounded up to JPEG block size and be larger than the image's width and height.
- if (!provider->onGetYUVSizes(yuvInfo->fSize)) {
+ // Fetch yuv plane sizes for memory allocation.
+ if (!provider->onQueryYUV8(&yuvInfo->fSizeInfo, &yuvInfo->fColorSpace)) {
return false;
}
// Allocate the memory for YUV
size_t totalSize(0);
- for (int i = 0; i < GrYUVProvider::kPlaneCount; ++i) {
- yuvInfo->fRowBytes[i] = yuvInfo->fSize[i].fWidth; // we assume snug fit: rb == width
- yuvInfo->fSizeInMemory[i] = yuvInfo->fRowBytes[i] * yuvInfo->fSize[i].fHeight;
- totalSize += yuvInfo->fSizeInMemory[i];
- }
+ totalSize += yuvInfo->fSizeInfo.fYWidthBytes * yuvInfo->fSizeInfo.fYSize.fHeight;
+ totalSize += yuvInfo->fSizeInfo.fUWidthBytes * yuvInfo->fSizeInfo.fUSize.fHeight;
+ totalSize += yuvInfo->fSizeInfo.fVWidthBytes * yuvInfo->fSizeInfo.fVSize.fHeight;
if (useCache) {
fCachedData.reset(SkResourceCache::NewCachedData(totalSize));
planes[0] = fCachedData->writable_data();
@@ -63,12 +62,13 @@ bool YUVScoper::init(GrYUVProvider* provider, SkYUVPlanesCache::Info* yuvInfo, v
fStorage.reset(totalSize);
planes[0] = fStorage.get();
}
- planes[1] = (uint8_t*)planes[0] + yuvInfo->fSizeInMemory[0];
- planes[2] = (uint8_t*)planes[1] + yuvInfo->fSizeInMemory[1];
+ planes[1] = (uint8_t*)planes[0] +
+ (yuvInfo->fSizeInfo.fYWidthBytes * yuvInfo->fSizeInfo.fYSize.fHeight);
+ planes[2] = (uint8_t*)planes[1] +
+ (yuvInfo->fSizeInfo.fUWidthBytes * yuvInfo->fSizeInfo.fUSize.fHeight);
- // Get the YUV planes and update plane sizes to actual image size
- if (!provider->onGetYUVPlanes(yuvInfo->fSize, planes, yuvInfo->fRowBytes,
- &yuvInfo->fColorSpace)) {
+ // Get the YUV planes.
+ if (!provider->onGetYUV8Planes(yuvInfo->fSizeInfo, planes)) {
return false;
}
@@ -88,25 +88,53 @@ GrTexture* GrYUVProvider::refAsTexture(GrContext* ctx, const GrSurfaceDesc& desc
return nullptr;
}
- GrSurfaceDesc yuvDesc;
- yuvDesc.fConfig = kAlpha_8_GrPixelConfig;
- SkAutoTUnref<GrTexture> yuvTextures[3];
- for (int i = 0; i < 3; ++i) {
msarett 2016/02/18 23:00:02 The fact that I needed to unroll this loop makes a
- yuvDesc.fWidth = yuvInfo.fSize[i].fWidth;
- yuvDesc.fHeight = yuvInfo.fSize[i].fHeight;
- // TODO: why do we need this check?
- bool needsExactTexture = (yuvDesc.fWidth != yuvInfo.fSize[0].fWidth) ||
- (yuvDesc.fHeight != yuvInfo.fSize[0].fHeight);
- if (needsExactTexture) {
- yuvTextures[i].reset(ctx->textureProvider()->createTexture(yuvDesc, true));
- } else {
- yuvTextures[i].reset(ctx->textureProvider()->createApproxTexture(yuvDesc));
- }
- if (!yuvTextures[i] ||
- !yuvTextures[i]->writePixels(0, 0, yuvDesc.fWidth, yuvDesc.fHeight,
- yuvDesc.fConfig, planes[i], yuvInfo.fRowBytes[i])) {
- return nullptr;
- }
+ GrSurfaceDesc yDesc, uDesc, vDesc;
+ yDesc.fConfig = kAlpha_8_GrPixelConfig;
+ uDesc.fConfig = kAlpha_8_GrPixelConfig;
+ vDesc.fConfig = kAlpha_8_GrPixelConfig;
+ SkAutoTUnref<GrTexture> yuvTextures[GrYUVProvider::kPlaneCount];
+
+ yDesc.fWidth = yuvInfo.fSizeInfo.fYSize.fWidth;
+ yDesc.fHeight = yuvInfo.fSizeInfo.fYSize.fHeight;
+ yuvTextures[GrYUVProvider::kY_Index].reset(ctx->textureProvider()->createTexture(yDesc, true));
+ if (!yuvTextures[GrYUVProvider::kY_Index] ||
+ !yuvTextures[GrYUVProvider::kY_Index]->writePixels(0, 0, yDesc.fWidth, yDesc.fHeight,
+ yDesc.fConfig, planes[GrYUVProvider::kY_Index], yuvInfo.fSizeInfo.fYWidthBytes)) {
+ return nullptr;
+ }
+
+ uDesc.fWidth = yuvInfo.fSizeInfo.fUSize.fWidth;
+ uDesc.fHeight = yuvInfo.fSizeInfo.fUSize.fHeight;
+ bool needsExactTexture = (uDesc.fWidth != yDesc.fWidth) ||
+ (uDesc.fHeight != yDesc.fHeight);
+ if (needsExactTexture) {
+ yuvTextures[GrYUVProvider::kU_Index].reset(
+ ctx->textureProvider()->createTexture(uDesc, true));
+ } else {
+ yuvTextures[GrYUVProvider::kU_Index].reset(
+ ctx->textureProvider()->createApproxTexture(uDesc));
+ }
+ if (!yuvTextures[GrYUVProvider::kU_Index] ||
+ !yuvTextures[GrYUVProvider::kU_Index]->writePixels(0, 0, uDesc.fWidth, uDesc.fHeight,
+ uDesc.fConfig, planes[GrYUVProvider::kU_Index], yuvInfo.fSizeInfo.fUWidthBytes)) {
+ return nullptr;
+ }
+
+ vDesc.fWidth = yuvInfo.fSizeInfo.fVSize.fWidth;
+ vDesc.fHeight = yuvInfo.fSizeInfo.fVSize.fHeight;
+ needsExactTexture = (vDesc.fWidth != vDesc.fWidth) ||
+ (vDesc.fHeight != vDesc.fHeight);
+ if (needsExactTexture) {
+ yuvTextures[GrYUVProvider::kV_Index].reset(
+ ctx->textureProvider()->createTexture(vDesc, true));
+ } else {
+ yuvTextures[GrYUVProvider::kV_Index].reset(
+ ctx->textureProvider()->createApproxTexture(vDesc));
+ }
+ if (!yuvTextures[GrYUVProvider::kV_Index] ||
+ !yuvTextures[GrYUVProvider::kV_Index]->writePixels(0, 0, vDesc.fWidth, vDesc.fHeight,
+ vDesc.fConfig, planes[GrYUVProvider::kV_Index], yuvInfo.fSizeInfo.fVWidthBytes)) {
+ return nullptr;
}
GrSurfaceDesc rtDesc = desc;
@@ -125,11 +153,12 @@ GrTexture* GrYUVProvider::refAsTexture(GrContext* ctx, const GrSurfaceDesc& desc
GrYUVEffect::CreateYUVToRGB(yuvTextures[0],
yuvTextures[1],
yuvTextures[2],
- yuvInfo.fSize,
+ &yuvInfo.fSizeInfo.fYSize,
msarett 2016/02/18 23:00:02 Nobody look here. This line isn't hacky at all. :
yuvInfo.fColorSpace));
paint.addColorFragmentProcessor(yuvToRgbProcessor);
paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
- const SkRect r = SkRect::MakeIWH(yuvInfo.fSize[0].fWidth, yuvInfo.fSize[0].fHeight);
+ const SkRect r = SkRect::MakeIWH(yuvInfo.fSizeInfo.fYSize.fWidth,
+ yuvInfo.fSizeInfo.fYSize.fHeight);
SkAutoTUnref<GrDrawContext> drawContext(ctx->drawContext(renderTarget));
if (!drawContext) {
« src/core/SkYUVPlanesCache.h ('K') | « src/gpu/GrYUVProvider.h ('k') | src/gpu/SkGr.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698