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

Unified Diff: include/codec/SkCodec.h

Issue 2045293002: Add support for multiple frames in SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebase; new API Created 4 years, 3 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 | « gm/animatedGif.cpp ('k') | src/codec/SkCodecAnimation.h » ('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 363347dd72c08f0e05f97433bf9a5da473df05ea..be01c63bf154a924f99126aa8e936d9d31c20066 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -244,6 +244,8 @@ public:
Options()
: fZeroInitialized(kNo_ZeroInitialized)
msarett 2016/09/21 22:23:48 I dislike having this option. Obviously unrelated
scroggo 2016/09/22 16:46:43 It's certainly awkward to have both fZeroInitializ
, fSubset(NULL)
+ , fFrameIndex(0)
msarett 2016/09/21 22:23:48 I think I might prefer it if all of the "multi-fra
scroggo 2016/09/22 16:46:42 I considered that, but I'm not sure whether it's b
+ , fHasPriorFrame(false)
{}
msarett 2016/09/21 22:23:48 While I'm nitting on the Options object, here's an
scroggo 2016/09/22 16:46:43 Yeah, we put those in the AndroidOptions object as
ZeroInitialized fZeroInitialized;
@@ -265,6 +267,30 @@ public:
* to getScanlines().
*/
SkIRect* fSubset;
+
+ /**
+ * For multiframe images, this represents the frame to decode.
+ *
+ * Ignored by single frame images.
+ */
+ size_t fFrameIndex;
+
+ /**
+ * If true, the dst already contains the prior frame.
+ *
+ * Only meaningful for multiframe images. If fFrameIndex needs to be
+ * blended with a prior frame (as reported by
+ * getRequiredFrame(fFrameIndex)), the client can set this to either
+ * true or false:
+ *
+ * true means that the prior frame is already in the dst, and this
+ * codec only needs to decode fFrameIndex and blend it with the dst.
+ *
+ * false means that the dst is uninitialized, so this codec needs to
+ * first decode the prior frame (which in turn may need to decode its
+ * prior frame).
+ */
+ bool fHasPriorFrame;
cblume 2016/09/22 01:08:47 I am curious about the design of this. As I under
cblume 2016/09/22 01:42:19 Adding to this: If we are still downloading the im
scroggo 2016/09/22 16:46:43 Agreed.
scroggo 2016/09/22 16:46:43 That is correct.
cblume 2016/09/22 21:29:02 I agree with what you are saying. Good thinking.
scroggo 2016/09/23 15:53:15 My preference would be to hide the dispose method
cblume 2016/09/23 19:15:45 I agree. We can cross that bridge if it becomes ne
};
/**
@@ -566,6 +592,40 @@ public:
*/
int outputScanline(int inputScanline) const;
+ /**
+ * Return the number of frames in the image.
+ *
+ * May require reading through the stream to determine the number of
+ * frames.
+ *
+ * As such, future decoding calls may require a rewind.
+ */
+ size_t getFrameCount() {
msarett 2016/09/21 22:23:48 Can we get away with not having this? Seems like
cblume 2016/09/22 01:08:47 In the case of gif and apng, we won't know in adva
cblume 2016/09/22 01:42:19 Correcting myself: We could still be wise about wh
joostouwerling 2016/09/22 15:43:16 For apng, the acTL chunk with the number of frames
scroggo 2016/09/22 16:46:42 FWIW, my initial design (patch set 1, which I work
cblume 2016/09/22 21:29:02 Oh man, that is a bummer. As a client, having the
scroggo 2016/09/23 15:53:15 It might be easier not to provide the metadata up
cblume 2016/09/23 19:15:45 An alternative would be if Chrome changed its catc
scroggo 2016/09/23 21:15:00 Those sound like good reasons to change the catchu
cblume 2016/09/23 23:31:32 Oh no no. I didn't mean that the API changes. I me
scroggo 2016/09/26 15:51:43 +1
+ return this->onGetFrameCount();
+ }
+
+ // The required frame for an independent frame is marked as
+ // kIndependentFrame.
+ static constexpr size_t kIndependentFrame = static_cast<size_t>(-1);
+
+ /**
+ * For a multiframed image, return the image that frame |index| needs to
+ * be blended with.
+ *
+ * If the frame needs no blending, return kIndependentFrame.
+ */
+ size_t getRequiredFrame(size_t index) {
+ return this->onGetRequiredFrame(index);
+ }
+
+ /**
+ * For a multiframed image, return the number of 1/100 seconds to
+ * show frame |index|.
+ */
+ size_t getFrameDuration(size_t index) {
+ return this->onGetFrameDuration(index);
+ }
+
protected:
/**
* Takes ownership of SkStream*
@@ -706,6 +766,18 @@ protected:
virtual int onOutputScanline(int inputScanline) const;
+ virtual size_t onGetFrameCount() {
+ return 1;
+ }
+
+ virtual size_t onGetRequiredFrame(size_t) {
+ return kIndependentFrame;
+ }
+
+ virtual size_t onGetFrameDuration(size_t) {
+ return 0;
+ }
+
/**
* Used for testing with qcms.
* FIXME: Remove this when we are done comparing with qcms.
« no previous file with comments | « gm/animatedGif.cpp ('k') | src/codec/SkCodecAnimation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698