55#import " flutter/shell/platform/darwin/ios/ios_external_texture_metal.h"
66
77#include " flutter/fml/logging.h"
8- #include " third_party/skia/include/core/SkYUVAIndex .h"
8+ #include " third_party/skia/include/core/SkYUVAInfo .h"
99#include " third_party/skia/include/gpu/GrBackendSurface.h"
1010#include " third_party/skia/include/gpu/GrDirectContext.h"
11+ #include " third_party/skia/include/gpu/GrYUVABackendTextures.h"
1112#include " third_party/skia/include/gpu/mtl/GrMtlTypes.h"
1213
1314namespace flutter {
132133 y_skia_texture_info.fTexture = sk_cf_obj<const void *>{
133134 [reinterpret_cast<NSObject *>(CVMetalTextureGetTexture (y_metal_texture)) retain ]};
134135
135- GrBackendTexture y_skia_backend_texture (/* width=*/ texture_size.width (),
136- /* height=*/ texture_size.height (),
137- /* mipMapped=*/ GrMipMapped ::kNo ,
138- /* textureInfo=*/ y_skia_texture_info);
136+ GrBackendTexture skia_backend_textures[2 ];
137+ skia_backend_textures[0 ] = GrBackendTexture (/* width=*/ texture_size.width (),
138+ /* height=*/ texture_size.height (),
139+ /* mipMapped=*/ GrMipMapped ::kNo ,
140+ /* textureInfo=*/ y_skia_texture_info);
139141
140142 fml::CFRef<CVMetalTextureRef> uv_metal_texture (uv_metal_texture_raw);
141143
142144 GrMtlTextureInfo uv_skia_texture_info;
143145 uv_skia_texture_info.fTexture = sk_cf_obj<const void *>{
144146 [reinterpret_cast<NSObject *>(CVMetalTextureGetTexture (uv_metal_texture)) retain ]};
145147
146- GrBackendTexture uv_skia_backend_texture (/* width=*/ texture_size.width (),
147- /* height=*/ texture_size.height (),
148- /* mipMapped=*/ GrMipMapped ::kNo ,
149- /* textureInfo=*/ uv_skia_texture_info);
150- GrBackendTexture nv12TextureHandles[] = {y_skia_backend_texture, uv_skia_backend_texture};
151- SkYUVAIndex yuvaIndices[4 ] = {
152- SkYUVAIndex{0 , SkColorChannel::kR }, // Read Y data from the red channel of the first texture
153- SkYUVAIndex{1 , SkColorChannel::kR }, // Read U data from the red channel of the second texture
154- SkYUVAIndex{1 ,
155- SkColorChannel::kG }, // Read V data from the green channel of the second texture
156- SkYUVAIndex{-1 , SkColorChannel::kA }}; // -1 means to omit the alpha data of YUVA
148+ skia_backend_textures[1 ] = GrBackendTexture (/* width=*/ texture_size.width (),
149+ /* height=*/ texture_size.height (),
150+ /* mipMapped=*/ GrMipMapped ::kNo ,
151+ /* textureInfo=*/ uv_skia_texture_info);
152+ SkYUVAInfo yuva_info (skia_backend_textures[0 ].dimensions (), SkYUVAInfo::PlaneConfig::kY_UV ,
153+ SkYUVAInfo::Subsampling::k444, kRec601_SkYUVColorSpace );
154+ GrYUVABackendTextures yuva_backend_textures (yuva_info, skia_backend_textures,
155+ kTopLeft_GrSurfaceOrigin );
157156
158157 struct ImageCaptures {
159158 fml::CFRef<CVPixelBufferRef> buffer;
@@ -170,9 +169,9 @@ GrBackendTexture uv_skia_backend_texture(/*width=*/texture_size.width(),
170169 auto captures = reinterpret_cast <ImageCaptures*>(release_context);
171170 delete captures;
172171 };
173- sk_sp<SkImage> image = SkImage::MakeFromYUVATextures (
174- context, kRec601_SkYUVColorSpace , nv12TextureHandles, yuvaIndices, texture_size ,
175- kTopLeft_GrSurfaceOrigin , /* imageColorSpace= */ nullptr , release_proc, captures.release ());
172+ sk_sp<SkImage> image =
173+ SkImage::MakeFromYUVATextures ( context, yuva_backend_textures, /* imageColorSpace= */ nullptr ,
174+ release_proc, captures.release ());
176175 return image;
177176}
178177
0 commit comments