1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrYUVProvider_DEFINED 9 #define GrYUVProvider_DEFINED 10 11 #include "GrTypes.h" 12 #include "SkImageInfo.h" 13 #include "SkYUVAIndex.h" 14 #include "SkYUVASizeInfo.h" 15 16 class GrContext; 17 class GrBackendFormat; 18 struct GrSurfaceDesc; 19 class GrTexture; 20 class GrTextureProxy; 21 class SkCachedData; 22 23 /** 24 * There are at least 2 different ways to extract/retrieve YUV planar data... 25 * - SkPixelRef 26 * - SkImageGenerator 27 * 28 * To share common functionality around using the planar data, we use this abstract base-class 29 * to represent accessing that data. 30 */ 31 class GrYUVProvider { 32 public: ~GrYUVProvider()33 virtual ~GrYUVProvider() {} 34 35 /** 36 * On success, this returns a texture proxy that has converted the YUV data from the provider 37 * into a form that is supported by the GPU (typically transformed into RGB). The texture will 38 * automatically have a key added, so it can be retrieved from the cache (assuming it is 39 * requested by a provider w/ the same genID). If srcColorSpace and dstColorSpace are 40 * specified, then a color conversion from src to dst will be applied to the pixels. 41 * 42 * On failure (e.g. the provider had no data), this returns NULL. 43 */ 44 sk_sp<GrTextureProxy> refAsTextureProxy(GrContext*, 45 const GrBackendFormat&, 46 const GrSurfaceDesc&, 47 SkColorSpace* srcColorSpace, 48 SkColorSpace* dstColorSpace); 49 50 sk_sp<SkCachedData> getPlanes(SkYUVASizeInfo*, SkYUVAIndex[SkYUVAIndex::kIndexCount], 51 SkYUVColorSpace*, const void* planes[SkYUVASizeInfo::kMaxCount]); 52 53 private: 54 virtual uint32_t onGetID() const = 0; 55 56 // These are not meant to be called by a client, only by the implementation 57 58 /** 59 * If decoding to YUV is supported, this returns true. Otherwise, this 60 * returns false and does not modify any of the parameters. 61 * 62 * @param sizeInfo Output parameter indicating the sizes and required 63 * allocation widths of the Y, U, V, and A planes. 64 * @param yuvaIndices How the YUVA planes are used/organized 65 * @param colorSpace Output parameter. 66 */ 67 virtual bool onQueryYUVA8(SkYUVASizeInfo* sizeInfo, 68 SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount], 69 SkYUVColorSpace* colorSpace) const = 0; 70 71 /** 72 * Returns true on success and false on failure. 73 * This always attempts to perform a full decode. If the client only 74 * wants size, it should call onQueryYUVA8(). 75 * 76 * @param sizeInfo Needs to exactly match the values returned by the 77 * query, except the WidthBytes may be larger than the 78 * recommendation (but not smaller). 79 * @param yuvaIndices How the YUVA planes are used/organized 80 * @param planes Memory for each of the Y, U, V, and A planes. 81 */ 82 virtual bool onGetYUVA8Planes(const SkYUVASizeInfo& sizeInfo, 83 const SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount], 84 void* planes[]) = 0; 85 86 // This is used as release callback for the YUV data that we capture in an SkImage when 87 // uploading to a gpu. When the upload is complete and we release the SkImage this callback will 88 // release the underlying data. 89 static void YUVGen_DataReleaseProc(const void*, void* data); 90 }; 91 92 #endif 93