55 if (segmentParameters->size() <
sizeof(
kMpfSig)) {
58 if (memcmp(segmentParameters->data(),
kMpfSig,
sizeof(
kMpfSig)) != 0) {
62 segmentParameters.
get(),
sizeof(
kMpfSig), segmentParameters->size() -
sizeof(
kMpfSig));
68 bool littleEndian =
false;
69 uint32_t ifdOffset = 0;
71 SkCodecPrintf(
"Failed to parse endian-ness and index IFD offset.\n");
84 uint16_t tagCount = ifd->getNumEntries();
87 uint32_t numberOfImages = 0;
94 uint16_t previousTag = 0;
95 for (uint16_t idfEntryIndex = 0; idfEntryIndex < tagCount; ++idfEntryIndex) {
96 uint16_t tag = ifd->getEntryTag(idfEntryIndex);
97 if (previousTag >= tag) {
106 sk_sp<SkData> data = ifd->getEntryUndefinedData(idfEntryIndex);
123 if (!ifd->getEntryUnsignedLong(idfEntryIndex, 1, &numberOfImages)) {
124 SkCodecPrintf(
"Number of Images was not 1 unsigned long.\n");
126 if (numberOfImages < 1) {
133 mpEntriesData = ifd->getEntryUndefinedData(idfEntryIndex);
134 if (!mpEntriesData) {
138 if (mpEntriesData->size() !=
kMPEntrySize * numberOfImages) {
139 SkCodecPrintf(
"MP entries data should be %ux%u bytes, was %u.\n",
142 static_cast<uint32_t
>(mpEntriesData->size()));
151 sk_sp<SkData> data = ifd->getEntryUndefinedData(idfEntryIndex);
164 uint32_t totalNumCapturedFrames = 0;
165 if (!ifd->getEntryUnsignedLong(idfEntryIndex, 1, &totalNumCapturedFrames)) {
166 SkCodecPrintf(
"Total Number of Captures Frames was not 1 unsigned long.\n");
174 if (!numberOfImages) {
175 SkCodecPrintf(
"Number of images must be greater than zero.\n");
178 if (!mpEntriesData) {
184 auto result = std::make_unique<SkJpegMultiPictureParameters>();
185 result->images.resize(numberOfImages);
190 for (uint32_t i = 0; i < numberOfImages; ++i) {
191 const uint8_t* mpEntryData = mpEntriesData->bytes() +
kMPEntrySize * i;
192 const uint32_t attribute =
get_endian_int(mpEntryData + 0, littleEndian);
193 const uint32_t size =
get_endian_int(mpEntryData + 4, littleEndian);
194 const uint32_t dataOffset =
get_endian_int(mpEntryData + 8, littleEndian);
196 const bool isPrimary =
201 if (isPrimary != (i == 0)) {
202 SkCodecPrintf(
"Image must be primary iff it is the first image..\n");
210 if (i == 0 && dataOffset != 0) {
211 SkCodecPrintf(
"First individual Image offset must be NULL.\n");
215 result->images[i].dataOffset = dataOffset;
216 result->images[i].size = size;