| Index: include/codec/SkCodec.h
|
| diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
|
| index 597ebd039e8a806bc09cf4c6f7eb0d1b8746ded8..5a57fd54cdbde4eed5920867f6703e3977f965aa 100644
|
| --- a/include/codec/SkCodec.h
|
| +++ b/include/codec/SkCodec.h
|
| @@ -277,6 +277,85 @@ public:
|
| */
|
| Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes);
|
|
|
| + struct YUVPlanesSizes {
|
| + SkISize YSize;
|
| + SkISize USize;
|
| + SkISize VSize;
|
| + };
|
| +
|
| + /**
|
| + * While the widths of the Y, U, and V planes are not restricted, the
|
| + * implementation requires that the width of the memory allocated for
|
| + * each plane be a multiple of DCTSIZE (which is always 8).
|
| + *
|
| + * This struct allows us to inform the client how many "widthBytes"
|
| + * that we need. Note that we use the new idea of "widthBytes" because
|
| + * this idea is distinct from "rowBytes" (used elsewhere in Skia).
|
| + * "rowBytes" allow the last row of the allocation to not include any
|
| + * extra padding, while, in this case, every single row of the allocation
|
| + * must be at least "widthBytes".
|
| + */
|
| + struct YUVPlanesWidthBytes {
|
| + size_t YWidthBytes;
|
| + size_t UWidthBytes;
|
| + size_t VWidthBytes;
|
| + };
|
| +
|
| + /**
|
| + * If decoding to YUV is supported, this returns true. Otherwise, this
|
| + * returns false and does not modify any of the parameters.
|
| + *
|
| + * @param sizes Output parameter indicating the sizes of the Y, U,
|
| + * and V planes.
|
| + * @param widthBytes Output parameter indicating the required allocation
|
| + * width in bytes for each of the Y, U, and V planes.
|
| + * @param colorSpace Output parameter. If non-NULL this is set to kJPEG,
|
| + * otherwise this is ignored.
|
| + */
|
| + bool queryYUV8(YUVPlanesSizes* sizes, YUVPlanesWidthBytes* widthBytes,
|
| + SkYUVColorSpace* colorSpace) const {
|
| + if (nullptr == sizes || nullptr == widthBytes) {
|
| + return false;
|
| + }
|
| +
|
| + return this->onQueryYUV8(sizes, widthBytes, colorSpace);
|
| + }
|
| +
|
| + /**
|
| + * Returns kSuccess, or another value explaining the type of failure.
|
| + * This always attempts to perform a full decode. If the client only
|
| + * wants size, it should call queryYUV8().
|
| + *
|
| + * @param sizes Sizes of each of the Y, U, and V planes. The size
|
| + * of the Y plane will be the same size as the image.
|
| + * The size of the U and V planes may be the same size
|
| + * as the image, or they may be a fraction of the size
|
| + * of the image (due to sampling). It is quite common
|
| + * for the width to be sampled at a different rate than
|
| + * the height. 2 and 4 are common sampling rates. The
|
| + * U and V planes are often the same size.
|
| + * @param planes Memory for each of the Y, U, and V planes.
|
| + * @param widthBytes Width in bytes of each row of the Y, U, and V planes.
|
| + * Each Y, U, or V "sample" is a single byte. Also,
|
| + * the implementation requires that the width of the
|
| + * memory allocated be padded to a multiple of 8. So
|
| + * the widthBytes should at least equal the Y, U, and V
|
| + * widths rounded up to the nearest multiples of 8.
|
| + */
|
| + Result getYUV8Planes(const YUVPlanesSizes* sizes, void* planes[3],
|
| + const YUVPlanesWidthBytes* widthBytes) {
|
| + if (nullptr == sizes || nullptr == planes || nullptr == planes[0] ||
|
| + nullptr == planes[1] || nullptr == planes[2] || nullptr == widthBytes) {
|
| + return kInvalidInput;
|
| + }
|
| +
|
| + if (!this->rewindIfNeeded()) {
|
| + return kCouldNotRewind;
|
| + }
|
| +
|
| + return this->onGetYUV8Planes(sizes, planes, widthBytes);
|
| + }
|
| +
|
| /**
|
| * The remaining functions revolve around decoding scanlines.
|
| */
|
| @@ -442,7 +521,7 @@ public:
|
| protected:
|
| SkCodec(const SkImageInfo&, SkStream*);
|
|
|
| - virtual SkISize onGetScaledDimensions(float /* desiredScale */) const {
|
| + virtual SkISize onGetScaledDimensions(float /*desiredScale*/) const {
|
| // By default, scaling is not supported.
|
| return this->getInfo().dimensions();
|
| }
|
| @@ -469,7 +548,16 @@ protected:
|
| SkPMColor ctable[], int* ctableCount,
|
| int* rowsDecoded) = 0;
|
|
|
| - virtual bool onGetValidSubset(SkIRect* /* desiredSubset */) const {
|
| + virtual bool onQueryYUV8(YUVPlanesSizes*, YUVPlanesWidthBytes*, SkYUVColorSpace*) const {
|
| + return false;
|
| + }
|
| +
|
| + virtual Result onGetYUV8Planes(const YUVPlanesSizes*, void*[3] /*planes*/,
|
| + const YUVPlanesWidthBytes*) {
|
| + return kUnimplemented;
|
| + }
|
| +
|
| + virtual bool onGetValidSubset(SkIRect* /*desiredSubset*/) const {
|
| // By default, subsets are not supported.
|
| return false;
|
| }
|
|
|