void SkJpegSegmentScanner::onByte(uint8_t byte) { switch (fState) { case State::kStartOfImageByte0: if (byte != 0xFF) {
SkCodecPrintf("First byte was %02x, not 0xFF", byte);
fState = State::kError; return;
}
fState = State::kStartOfImageByte1; break; case State::kStartOfImageByte1: if (byte != kJpegMarkerStartOfImage) {
SkCodecPrintf("Second byte was %02x, not %02x", byte, kJpegMarkerStartOfImage);
fState = State::kError; return;
}
onMarkerSecondByte(byte); break; case State::kSecondMarkerByte0: if (byte != 0xFF) {
SkCodecPrintf("Third byte was %02x, not 0xFF", byte);
fState = State::kError; return;
}
fState = State::kSecondMarkerByte1; break; case State::kSecondMarkerByte1: // See section B.1.1.3: All markers are assigned two-byte codes: a 0xFF byte followed by // a byte which is not equal to 0x00 or 0xFF. if (byte == 0xFF || byte == 0x00) {
SkCodecPrintf("SkJpegSegment marker was 0xFF,0xFF or 0xFF,0x00");
fState = State::kError; return;
}
onMarkerSecondByte(byte); break; case State::kSegmentParamLengthByte0:
fSegmentParamLengthByte0 = byte;
fState = State::kSegmentParamLengthByte1; break; case State::kSegmentParamLengthByte1: {
uint16_t paramLength = 256u * fSegmentParamLengthByte0 + byte;
fSegmentParamLengthByte0 = 0;
// See section B.1.1.4: A marker segment consists of a marker followed by a sequence // of related parameters. The first parameter in a marker segment is the two-byte length // parameter. This length parameter encodes the number of bytes in the marker segment, // including the length parameter and excluding the two-byte marker. if (paramLength < kJpegSegmentParameterLengthSize) {
SkCodecPrintf("SkJpegSegment payload length was %u < 2 bytes", paramLength);
fState = State::kError; return;
}
saveCurrentSegment(paramLength);
fSegmentParamBytesRemaining = paramLength - kJpegSegmentParameterLengthSize; if (fSegmentParamBytesRemaining > 0) {
fState = State::kSegmentParam;
} else {
fState = State::kEntropyCodedData;
} break;
} case State::kSegmentParam:
SkASSERT(fSegmentParamBytesRemaining > 0);
fSegmentParamBytesRemaining -= 1; if (fSegmentParamBytesRemaining == 0) {
fState = State::kEntropyCodedData;
} break; case State::kEntropyCodedData: if (byte == 0xFF) {
fState = State::kEntropyCodedDataSentinel;
} break; case State::kEntropyCodedDataSentinel: if (byte == 0x00) {
fState = State::kEntropyCodedData;
} elseif (byte == 0xFF) {
fState = State::kPostEntropyCodedDataFill;
} else {
onMarkerSecondByte(byte);
} break; case State::kPostEntropyCodedDataFill: // See section B.1.1.3: Any marker may optionally be preceded by any number of fill // bytes, which are bytes assigned code 0xFF. Skip past any 0xFF fill bytes that may be // present at the end of the entropy-coded data. if (byte == 0xFF) {
fState = State::kPostEntropyCodedDataFill;
} elseif (byte == 0x00) {
SkCodecPrintf("Post entropy coded data had 0xFF,0x00");
fState = State::kError; return;
} else {
onMarkerSecondByte(byte);
} break; case State::kDone: break; case State::kError: break;
}
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.