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>
This commit is contained in:
Leon Scroggins III 2016-12-08 11:38:58 -05:00 committed by Skia Commit-Bot
parent 19d20c6176
commit 3639faada2
3 changed files with 16 additions and 0 deletions

View File

@ -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;
};
/**

View File

@ -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;
}

View File

@ -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]);