| 3766 | } |
| 3767 | |
| 3768 | static avifResult avifParseSampleTableBox(avifTrack * track, uint64_t rawOffset, const uint8_t * raw, size_t rawLen, avifDiagnostics * diag) |
| 3769 | { |
| 3770 | if (track->sampleTable) { |
| 3771 | // A TrackBox may only have one SampleTable |
| 3772 | avifDiagnosticsPrintf(diag, "Duplicate Box[stbl] for a single track detected"); |
| 3773 | return AVIF_RESULT_BMFF_PARSE_FAILED; |
| 3774 | } |
| 3775 | track->sampleTable = avifSampleTableCreate(); |
| 3776 | AVIF_CHECKERR(track->sampleTable != NULL, AVIF_RESULT_OUT_OF_MEMORY); |
| 3777 | |
| 3778 | BEGIN_STREAM(s, raw, rawLen, diag, "Box[stbl]"); |
| 3779 | |
| 3780 | while (avifROStreamHasBytesLeft(&s, 1)) { |
| 3781 | avifBoxHeader header; |
| 3782 | AVIF_CHECKERR(avifROStreamReadBoxHeader(&s, &header), AVIF_RESULT_BMFF_PARSE_FAILED); |
| 3783 | |
| 3784 | if (!memcmp(header.type, "stco", 4)) { |
| 3785 | AVIF_CHECKRES(avifParseChunkOffsetBox(track->sampleTable, AVIF_FALSE, avifROStreamCurrent(&s), header.size, diag)); |
| 3786 | } else if (!memcmp(header.type, "co64", 4)) { |
| 3787 | AVIF_CHECKRES(avifParseChunkOffsetBox(track->sampleTable, AVIF_TRUE, avifROStreamCurrent(&s), header.size, diag)); |
| 3788 | } else if (!memcmp(header.type, "stsc", 4)) { |
| 3789 | AVIF_CHECKRES(avifParseSampleToChunkBox(track->sampleTable, avifROStreamCurrent(&s), header.size, diag)); |
| 3790 | } else if (!memcmp(header.type, "stsz", 4)) { |
| 3791 | AVIF_CHECKRES(avifParseSampleSizeBox(track->sampleTable, avifROStreamCurrent(&s), header.size, diag)); |
| 3792 | } else if (!memcmp(header.type, "stss", 4)) { |
| 3793 | AVIF_CHECKRES(avifParseSyncSampleBox(track->sampleTable, avifROStreamCurrent(&s), header.size, diag)); |
| 3794 | } else if (!memcmp(header.type, "stts", 4)) { |
| 3795 | AVIF_CHECKRES(avifParseTimeToSampleBox(track->sampleTable, avifROStreamCurrent(&s), header.size, diag)); |
| 3796 | } else if (!memcmp(header.type, "stsd", 4)) { |
| 3797 | AVIF_CHECKRES(avifParseSampleDescriptionBox(track->sampleTable, |
| 3798 | rawOffset + avifROStreamOffset(&s), |
| 3799 | avifROStreamCurrent(&s), |
| 3800 | header.size, |
| 3801 | diag)); |
| 3802 | } |
| 3803 | |
| 3804 | AVIF_CHECKERR(avifROStreamSkip(&s, header.size), AVIF_RESULT_BMFF_PARSE_FAILED); |
| 3805 | } |
| 3806 | return AVIF_RESULT_OK; |
| 3807 | } |
| 3808 | |
| 3809 | static avifResult avifParseMediaInformationBox(avifTrack * track, uint64_t rawOffset, const uint8_t * raw, size_t rawLen, avifDiagnostics * diag) |
| 3810 | { |
no test coverage detected