286 {
288
290 if (error) *error = "Invalid track info";
291 return annexB;
292 }
293
295
296
297 for (
const auto& sps : track.
sps) {
302 for (fl::size j = 0; j < sps.size(); j++) {
304 }
305 }
306
307
308 for (
const auto& pps : track.
pps) {
313 for (fl::size j = 0; j < pps.size(); j++) {
315 }
316 }
317
318
319 fl::size mdatPos = fl::size(-1);
320 {
322 while (
pos + 8 <= data.
size()) {
323 bool ok = true;
325 if (!ok || boxSize < 8) break;
328 break;
329 }
331 }
332 }
333
334 if (mdatPos == fl::size(-1)) {
335 if (error) *error = "No mdat box found";
336 return annexB;
337 }
338
339 bool ok = true;
340 fl::u32 mdatSize =
readU32BE(data, mdatPos, ok);
341 if (!ok) {
342 if (error) *error = "Invalid mdat box size";
343 return annexB;
344 }
345
346 fl::size mdatBody = mdatPos + 8;
347 fl::size mdatEnd = mdatPos + mdatSize;
348 if (mdatEnd > data.
size()) mdatEnd = data.
size();
349
350 fl::size
pos = mdatBody;
351 while (
pos + nalLenSize <= mdatEnd) {
352 fl::u32 nalLen = 0;
353 for (
fl::u8 k = 0; k < nalLenSize; k++) {
354 nalLen = (nalLen << 8) | data[
pos + k];
355 }
357
358 if (
pos + nalLen > mdatEnd)
break;
359
360
365 for (fl::u32 j = 0; j < nalLen; j++) {
367 }
369 }
370
371 return annexB;
372}
constexpr fl::size size() const FL_NO_EXCEPT
void push_back(const T &value) FL_NO_EXCEPT
fl::u32 readU32BE(fl::span< const fl::u8 > data, fl::size offset, bool &ok) FL_NO_EXCEPT
bool boxIs(fl::span< const fl::u8 > data, fl::size offset, const char *type) FL_NO_EXCEPT
fl::u8 lengthSizeMinusOne
fl::vector< fl::vector< fl::u8 > > pps
fl::vector< fl::vector< fl::u8 > > sps