aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2016-12-08 11:38:58 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-12-14 18:39:34 +0000
commit3639faada2e7b59de20de82b7d2786c8eb2e32e6 (patch)
treedbf4ada3fec142cd79999ac1630733b820f159a1
parent19d20c6176e8fe955d115e30882fc6f366523214 (diff)
Add SkCodec::FrameInfo::fFullyReceived
This indicates whether the frame has been fully received, i.e. the stream contains enough data to decode to the end of the frame. A client may want to use this to know whether they should attempt to decode this frame, if they do not want to decode partial frames. Change-Id: I336c7031b0c0b8c1401ce040f5372aedc87fdc14 Reviewed-on: https://skia-review.googlesource.com/5703 Reviewed-by: Chris Blume <cblume@google.com> Reviewed-by: Derek Sollenberger <djsollen@google.com> Commit-Queue: Leon Scroggins <scroggo@google.com>
-rw-r--r--include/codec/SkCodec.h8
-rw-r--r--src/codec/SkGifCodec.cpp1
-rw-r--r--tests/CodecPartialTest.cpp7
3 files changed, 16 insertions, 0 deletions
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index 314bec461c..89fc57ef32 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -602,6 +602,14 @@ public:
* Number of milliseconds to show this frame.
*/
size_t fDuration;
+
+ /**
+ * Whether the end marker for this frame is contained in the stream.
+ *
+ * Note: this does not guarantee that an attempt to decode will be complete.
+ * There could be an error in the stream.
+ */
+ bool fFullyReceived;
};
/**
diff --git a/src/codec/SkGifCodec.cpp b/src/codec/SkGifCodec.cpp
index 7b07f2a59a..9c7746da65 100644
--- a/src/codec/SkGifCodec.cpp
+++ b/src/codec/SkGifCodec.cpp
@@ -140,6 +140,7 @@ std::vector<SkCodec::FrameInfo> SkGifCodec::onGetFrameInfo() {
const SkGIFFrameContext* frameContext = fReader->frameContext(i);
result[i].fDuration = frameContext->delayTime();
result[i].fRequiredFrame = frameContext->getRequiredFrame();
+ result[i].fFullyReceived = frameContext->isComplete();
}
return result;
}
diff --git a/tests/CodecPartialTest.cpp b/tests/CodecPartialTest.cpp
index e29037dd14..93e5d63f22 100644
--- a/tests/CodecPartialTest.cpp
+++ b/tests/CodecPartialTest.cpp
@@ -247,6 +247,9 @@ DEF_TEST(Codec_partialAnim, r) {
const size_t secondHalf = fullFrameBytes - firstHalf;
haltingStream->addNewData(firstHalf);
+ auto frameInfo = partialCodec->getFrameInfo();
+ REPORTER_ASSERT(r, frameInfo.size() == i + 1);
+ REPORTER_ASSERT(r, !frameInfo[i].fFullyReceived);
SkBitmap frame;
frame.allocPixels(info);
@@ -268,6 +271,10 @@ DEF_TEST(Codec_partialAnim, r) {
result = partialCodec->incrementalDecode();
REPORTER_ASSERT(r, SkCodec::kSuccess == result);
+ frameInfo = partialCodec->getFrameInfo();
+ REPORTER_ASSERT(r, frameInfo.size() == i + 1);
+ REPORTER_ASSERT(r, frameInfo[i].fFullyReceived);
+
// allocPixels locked the pixels for frame, but frames[i] was copied
// from another bitmap, and did not retain the locked status.
SkAutoLockPixels alp(frames[i]);