int mxf_read_next_nonfiller_kl(MXFFile *mxfFile, mxfKey *key, uint8_t *llen, uint64_t *len) { mxfKey tkey; uint8_t tllen; uint64_t tlen; CHK_ORET(mxf_read_kl(mxfFile, &tkey, &tllen, &tlen)); while (mxf_is_filler(&tkey)) { CHK_ORET(mxf_skip(mxfFile, (int64_t)tlen)); CHK_ORET(mxf_read_kl(mxfFile, &tkey, &tllen, &tlen)); } *key = tkey; *llen = tllen; *len = tlen; return 1; }
/* Read primer pack followed by sets. The inputs pkey, pllen, plen must correspond to that for the primer pack */ int mxf_read_filtered_header_metadata(MXFFile* mxfFile, MXFReadFilter* filter, MXFHeaderMetadata* headerMetadata, uint64_t headerByteCount, const mxfKey* pkey, uint8_t pllen, uint64_t plen) { mxfKey key; uint8_t llen; uint64_t len; int skip = 0; MXFMetadataSet* newSet = NULL; uint64_t count = 0; int result; CHK_ORET(headerByteCount != 0); /* check that input pkey is as expected, and assume pllen and plen are also ok */ CHK_ORET(mxf_is_primer_pack(pkey)); count += mxfKey_extlen + pllen; if (headerMetadata->primerPack != NULL) { mxf_free_primer_pack(&headerMetadata->primerPack); } CHK_ORET(mxf_read_primer_pack(mxfFile, &headerMetadata->primerPack)); count += plen; while (count < headerByteCount) { CHK_ORET(mxf_read_kl(mxfFile, &key, &llen, &len)); count += mxfKey_extlen + llen; if (mxf_is_filler(&key)) { CHK_ORET(mxf_skip(mxfFile, len)); } else { if (filter != NULL) { /* signal before read */ skip = 0; if (filter->before_set_read != NULL) { CHK_ORET(filter->before_set_read(filter->privateData, headerMetadata, &key, llen, len, &skip)); } if (!skip) { CHK_ORET((result = mxf_read_and_return_set(mxfFile, &key, len, headerMetadata, 0, &newSet)) > 0); if (result == 1) /* set was read and returned in "set" parameter */ { /* signal after read */ skip = 0; if (filter->after_set_read != NULL) { CHK_OFAIL(filter->after_set_read(filter->privateData, headerMetadata, newSet, &skip)); } if (!skip) { CHK_OFAIL(mxf_add_set(headerMetadata, newSet)); } else { mxf_free_set(&newSet); } } } else { CHK_ORET(mxf_skip(mxfFile, len)); } } else { CHK_ORET(mxf_read_set(mxfFile, &key, len, headerMetadata, 1) > 0); } } count += len; } CHK_ORET(count == headerByteCount); return 1; fail: mxf_free_set(&newSet); return 0; }