285 {
287
289 if (error) *error = "Invalid track info";
290 return annexB;
291 }
292
294
295
296 for (
const auto& sps : track.
sps) {
301 for (fl::size j = 0; j < sps.size(); j++) {
303 }
304 }
305
306
307 for (
const auto& pps : track.
pps) {
312 for (fl::size j = 0; j < pps.size(); j++) {
314 }
315 }
316
317
318 fl::size mdatPos = fl::size(-1);
319 {
321 while (
pos + 8 <= data.
size()) {
322 bool ok = true;
324 if (!ok || boxSize < 8) break;
327 break;
328 }
330 }
331 }
332
333 if (mdatPos == fl::size(-1)) {
334 if (error) *error = "No mdat box found";
335 return annexB;
336 }
337
338 bool ok = true;
339 fl::u32 mdatSize =
readU32BE(data, mdatPos, ok);
340 if (!ok) {
341 if (error) *error = "Invalid mdat box size";
342 return annexB;
343 }
344
345 fl::size mdatBody = mdatPos + 8;
346 fl::size mdatEnd = mdatPos + mdatSize;
347 if (mdatEnd > data.
size()) mdatEnd = data.
size();
348
349 fl::size
pos = mdatBody;
350 while (
pos + nalLenSize <= mdatEnd) {
351 fl::u32 nalLen = 0;
352 for (
fl::u8 k = 0; k < nalLenSize; k++) {
353 nalLen = (nalLen << 8) | data[
pos + k];
354 }
356
357 if (
pos + nalLen > mdatEnd)
break;
358
359
364 for (fl::u32 j = 0; j < nalLen; j++) {
366 }
368 }
369
370 return annexB;
371}
constexpr fl::size size() const FL_NOEXCEPT
void push_back(const T &value) FL_NOEXCEPT
fl::u32 readU32BE(fl::span< const fl::u8 > data, fl::size offset, bool &ok)
bool boxIs(fl::span< const fl::u8 > data, fl::size offset, const char *type)
fl::u8 lengthSizeMinusOne
fl::vector< fl::vector< fl::u8 > > pps
fl::vector< fl::vector< fl::u8 > > sps