117 io::ExitTrigger et(rdr);
119 if (end < rdr.
getBeg() + 48)
121 ID3D_NOTICE(
"mm::parse: bailing, not enough bytes to parse, pos = " << end );
129 if (io::readText(rdr, 32) !=
"Brava Software Inc. ")
131 ID3D_NOTICE(
"mm::parse: bailing, couldn't find footer" );
135 version = io::readText(rdr, 4);
136 if (version.size() != 4 ||
137 !isdigit(version[0]) || version[1] !=
'.' ||
138 !isdigit(version[2]) ||
139 !isdigit(version[3]))
141 ID3D_WARNING(
"mm::parse: bailing, nonstandard version = " << version );
150 ID3D_NOTICE(
"mm::parse: bailing, not enough bytes to parse offsets, pos = " << end );
155 io::WindowedReader dataWindow(rdr);
156 dataWindow.setEnd(rdr.
getCur());
160 io::WindowedReader offsetWindow(rdr, 20);
161 for (
size_t i = 0; i < 5; ++i)
163 offsets[i] = io::readLENumber(rdr,
sizeof(uint32));
166 size_t metadataSize = 0;
167 if (version <=
"3.00")
179 size_t possibleSizes[] = { 8132, 8004, 7936 };
181 for (
size_t i = 0; i <
sizeof(possibleSizes)/
sizeof(size_t); ++i)
183 dataWindow.setCur(dataWindow.getEnd());
187 size_t offset = possibleSizes[i] + 256;
188 if (dataWindow.getCur() < offset)
194 dataWindow.setCur(dataWindow.getCur() - offset);
197 if (io::readText(dataWindow, 8) ==
"18273645")
199 metadataSize = possibleSizes[i];
204 if (0 == metadataSize)
208 ID3D_WARNING(
"mm::parse: bailing, couldn't find meta data signature, end = " << end );
214 size_t sectionSizes[5];
215 size_t tagSize = metadataSize;
218 sectionSizes[4] = metadataSize;
220 size_t lastOffset = 0;
221 for (
int i = 0; i < 5; i++)
223 size_t thisOffset = offsets[i];
227 size_t sectionSize = thisOffset - lastOffset;
228 sectionSizes[i-1] = sectionSize;
229 tagSize += sectionSize;
231 lastOffset = thisOffset;
235 if (dataWindow.getEnd() < tagSize)
239 ID3D_WARNING(
"mm::parse: bailing, tag size is too big, tag size = " << tagSize <<
", end = " << end );
243 dataWindow.setBeg(dataWindow.getEnd() - tagSize);
244 dataWindow.setCur(dataWindow.getBeg());
247 offsets[0] = dataWindow.getBeg();
248 for (
size_t i = 0; i < 4; ++i)
250 offsets[i+1] = offsets[i] + sectionSizes[i];
254 if (dataWindow.getBeg() >= 256)
256 rdr.
setCur(dataWindow.getBeg() - 256);
257 if (io::readText(rdr, 8) ==
"18273645")
259 et.setExitPos(rdr.
getCur() - 8);
263 et.setExitPos(dataWindow.getBeg());
265 dataWindow.setCur(dataWindow.getBeg());
271 dataWindow.setCur(offsets[0]);
272 String imgExt = io::readTrailingSpaces(dataWindow, 4);
275 dataWindow.setCur(offsets[1]);
276 uint32 imgSize = io::readLENumber(dataWindow, 4);
283 io::WindowedReader imgWindow(dataWindow, imgSize);
284 if (imgWindow.getEnd() < imgWindow.getBeg() + imgSize)
291 BString imgData = io::readAllBinary(imgWindow);
295 String mimetype(
"image/");
301 frame->GetField(
ID3FN_DATA)->Set(
reinterpret_cast<const uchar*
>(imgData.data()), imgData.size());
309 dataWindow.setCur(offsets[4]);
324 dataWindow.skipChars(12);
330 uint32 trkNum = io::readLENumber(dataWindow, 2);
337 frame->GetField(
ID3FN_TEXT)->Set(trkStr.c_str());