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

Unified Diff: include/codec/SkCodec.h

Issue 1549473003: Add getYUV8Planes() API to SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Combined the structs Created 4 years, 11 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
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | resources/cropped_mandrill.jpg » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/codec/SkCodec.h
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index 597ebd039e8a806bc09cf4c6f7eb0d1b8746ded8..8fd3187cf22904d443bb96dfd13a0dbc3dff8462 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -277,6 +277,81 @@ public:
*/
Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes);
+ struct YUVSizeInfo {
reed1 2016/01/22 16:01:46 Just so I understand the difference... Size means
msarett 2016/01/22 16:14:14 Yes that's correct.
+ SkISize fYSize;
+ SkISize fUSize;
+ SkISize fVSize;
+
+ /**
+ * 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".
+ */
+ size_t fYWidthBytes;
+ size_t fUWidthBytes;
+ size_t fVWidthBytes;
+ };
+
+ /**
+ * If decoding to YUV is supported, this returns true. Otherwise, this
+ * returns false and does not modify any of the parameters.
+ *
+ * @param sizeInfo Output parameter indicating the sizes and required
+ * allocation widths 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(YUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const {
+ if (nullptr == sizeInfo) {
reed1 2016/01/22 16:01:46 interesting: why is one parameter optional and the
msarett 2016/01/22 16:14:14 I'm fine with making both optional or both require
msarett 2016/01/22 21:08:45 Any thoughts?
+ return false;
+ }
+
+ return this->onQueryYUV8(sizeInfo, 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 sizeInfo Contains 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.
+ * Also contains, the 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
reed1 2016/01/22 18:40:16 This comment seems very JPEG specific. Do we need
msarett 2016/01/22 21:08:45 I think the detail is a bit much. Fixed. So are
+ * multiple of 8. So the widthBytes should at least
+ * equal the Y, U, and V widths rounded up to the
+ * nearest multiples of 8.
+ * @param planes Memory for each of the Y, U, and V planes.
+ */
+ Result getYUV8Planes(const YUVSizeInfo& sizeInfo, void* planes[3]) {
reed1 2016/01/22 16:01:46 Why do we pass the info back in? Can it (legally)
msarett 2016/01/22 16:14:14 The WidthBytes may be larger than the recommended
+ if (nullptr == planes || nullptr == planes[0] || nullptr == planes[1] ||
+ nullptr == planes[2]) {
+ return kInvalidInput;
+ }
+
+ if (!this->rewindIfNeeded()) {
+ return kCouldNotRewind;
+ }
+
+ return this->onGetYUV8Planes(sizeInfo, planes);
+ }
+
/**
* The remaining functions revolve around decoding scanlines.
*/
@@ -442,7 +517,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 +544,15 @@ protected:
SkPMColor ctable[], int* ctableCount,
int* rowsDecoded) = 0;
- virtual bool onGetValidSubset(SkIRect* /* desiredSubset */) const {
+ virtual bool onQueryYUV8(YUVSizeInfo*, SkYUVColorSpace*) const {
+ return false;
+ }
+
+ virtual Result onGetYUV8Planes(const YUVSizeInfo&, void*[3] /*planes*/) {
+ return kUnimplemented;
+ }
+
+ virtual bool onGetValidSubset(SkIRect* /*desiredSubset*/) const {
// By default, subsets are not supported.
return false;
}
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | resources/cropped_mandrill.jpg » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698