1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef YUVUtils_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define YUVUtils_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkYUVAPixmaps.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class SkData; 20*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 21*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { class Recorder; } 22*c8dee2aaSAndroid Build Coastguard Worker #endif 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace sk_gpu_test { 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker // Splits an input image into A8 YUV[A] planes using the passed subsampling and YUV color space. If 27*c8dee2aaSAndroid Build Coastguard Worker // the src image is opaque there will be three planes (Y, U, and V) and if not there will be a 28*c8dee2aaSAndroid Build Coastguard Worker // fourth A plane. The planes are returned along with a SkYUVAInfo describing the resulting planar 29*c8dee2aaSAndroid Build Coastguard Worker // image. Images are made as textures if GrRecordingContext is not null, otherwise as cpu images. 30*c8dee2aaSAndroid Build Coastguard Worker std::tuple<std::array<sk_sp<SkImage>, SkYUVAInfo::kMaxPlanes>, SkYUVAInfo> 31*c8dee2aaSAndroid Build Coastguard Worker MakeYUVAPlanesAsA8(SkImage*, 32*c8dee2aaSAndroid Build Coastguard Worker SkYUVColorSpace, 33*c8dee2aaSAndroid Build Coastguard Worker SkYUVAInfo::Subsampling, 34*c8dee2aaSAndroid Build Coastguard Worker GrRecordingContext*); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker // Utility that decodes a JPEG but preserves the YUVA8 planes in the image, and uses 37*c8dee2aaSAndroid Build Coastguard Worker // MakeFromYUVAPixmaps to create a GPU multiplane YUVA image for a context. It extracts the planar 38*c8dee2aaSAndroid Build Coastguard Worker // data once, and lazily creates the actual SkImage when the GrContext is provided (and refreshes 39*c8dee2aaSAndroid Build Coastguard Worker // the image if the context has changed, as in Viewer) 40*c8dee2aaSAndroid Build Coastguard Worker class LazyYUVImage { 41*c8dee2aaSAndroid Build Coastguard Worker public: 42*c8dee2aaSAndroid Build Coastguard Worker // Returns null if the data could not be extracted into YUVA planes 43*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<LazyYUVImage> Make(sk_sp<SkData> data, 44*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo, 45*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> = nullptr); 46*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<LazyYUVImage> Make(SkYUVAPixmaps, 47*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped = skgpu::Mipmapped::kNo, 48*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> = nullptr); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker enum class Type { kFromPixmaps, kFromGenerator, kFromTextures, kFromImages }; 51*c8dee2aaSAndroid Build Coastguard Worker dimensions()52*c8dee2aaSAndroid Build Coastguard Worker SkISize dimensions() const { return fPixmaps.yuvaInfo().dimensions(); } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> refImage(GrRecordingContext* rContext, Type); 55*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 56*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> refImage(skgpu::graphite::Recorder* recorder, Type); 57*c8dee2aaSAndroid Build Coastguard Worker #endif 58*c8dee2aaSAndroid Build Coastguard Worker 59*c8dee2aaSAndroid Build Coastguard Worker private: 60*c8dee2aaSAndroid Build Coastguard Worker // Decoded YUV data 61*c8dee2aaSAndroid Build Coastguard Worker SkYUVAPixmaps fPixmaps; 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker skgpu::Mipmapped fMipmapped; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fColorSpace; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker // Memoized SkImages formed with planes, one for each Type. 68*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fYUVImage[4]; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker LazyYUVImage() = default; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker bool reset(sk_sp<SkData> data, skgpu::Mipmapped, sk_sp<SkColorSpace>); 73*c8dee2aaSAndroid Build Coastguard Worker bool reset(SkYUVAPixmaps pixmaps, skgpu::Mipmapped, sk_sp<SkColorSpace>); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker bool ensureYUVImage(GrRecordingContext* rContext, Type type); 76*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 77*c8dee2aaSAndroid Build Coastguard Worker bool ensureYUVImage(skgpu::graphite::Recorder* recorder, Type type); 78*c8dee2aaSAndroid Build Coastguard Worker #endif 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker } // namespace sk_gpu_test 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker #endif // YUVUtils_DEFINED 84