int mxf_allocate_space_to_kag(MXFFile *mxfFile, MXFPartition *partition, uint32_t size) { int64_t filePos; uint64_t relativeFilePos; int64_t fillSize; uint8_t llen; assert(partition->kagSize > 0); if (size == 0 && partition->kagSize == 1) { return 1; } CHK_ORET((filePos = mxf_file_tell(mxfFile)) >= 0); CHK_ORET((uint64_t)filePos > partition->thisPartition); relativeFilePos = filePos + size - partition->thisPartition; if (size != 0 || (relativeFilePos % partition->kagSize) != 0) { CHK_ORET(mxf_write_k(mxfFile, &g_KLVFill_key)); fillSize = (int64_t)size - mxfKey_extlen; if (partition->kagSize > 1) { fillSize += partition->kagSize - relativeFilePos % partition->kagSize; } if (fillSize >= 0) { llen = mxf_get_llen(mxfFile, fillSize); } else { llen = 0; } while (fillSize - llen < 0) { fillSize += partition->kagSize; if (fillSize >= 0) { llen = mxf_get_llen(mxfFile, fillSize); } else { llen = 0; } } fillSize -= llen; CHK_ORET(mxf_write_l(mxfFile, fillSize)); CHK_ORET(mxf_write_zeros(mxfFile, fillSize)); } return 1; }
/* note: keep in sync with mxf_write_set */ uint64_t mxf_get_set_size(MXFFile* mxfFile, MXFMetadataSet* set) { MXFListIterator iter; uint64_t len; uint8_t llen; if (set->fixedSpaceAllocation > 0) { return set->fixedSpaceAllocation; } len = 0; mxf_initialise_list_iter(&iter, &set->items); while (mxf_next_list_iter_element(&iter)) { len += ((MXFMetadataItem*)mxf_get_iter_element(&iter))->length + 4; } llen = mxf_get_llen(mxfFile, len); if (llen < 4) { /* spec says preferred 4-byte BER encoded len for sets */ llen = 4; } return mxfKey_extlen + len + llen; }
int mxf_fill_to_position(MXFFile *mxfFile, uint64_t position) { int64_t filePos; uint64_t fillSize; uint8_t llen; CHK_ORET((filePos = mxf_file_tell(mxfFile)) >= 0); if ((uint64_t)filePos == position) { return 1; } CHK_ORET(((uint64_t)filePos <= position - mxf_get_min_llen(mxfFile) + mxfKey_extlen)); CHK_ORET(mxf_write_k(mxfFile, &g_KLVFill_key)); fillSize = position - filePos - mxfKey_extlen; llen = mxf_get_llen(mxfFile, fillSize); assert(fillSize >= llen); fillSize -= llen; CHK_ORET(mxf_write_l(mxfFile, fillSize)); CHK_ORET(mxf_write_zeros(mxfFile, fillSize)); return 1; }
/* note: keep in sync with mxf_get_set_len */ int mxf_write_set(MXFFile* mxfFile, MXFMetadataSet* set) { MXFListIterator iter; uint64_t setLen = 0; uint64_t setSize = 0; mxf_initialise_list_iter(&iter, &set->items); while (mxf_next_list_iter_element(&iter)) { setLen += ((MXFMetadataItem*)mxf_get_iter_element(&iter))->length + 4; } if (mxf_get_llen(mxfFile, setLen) <= 4) { /* spec says preferred 4-byte BER encoded len for sets */ CHK_ORET(mxf_write_fixed_kl(mxfFile, &set->key, 4, setLen)); setSize = mxfKey_extlen + 4 + setLen; } else { CHK_ORET(mxf_write_kl(mxfFile, &set->key, setLen)); setSize = mxfKey_extlen + mxf_get_llen(mxfFile, setLen) + setLen; } mxf_initialise_list_iter(&iter, &set->items); while (mxf_next_list_iter_element(&iter)) { CHK_ORET(mxf_write_item(mxfFile, (MXFMetadataItem*)mxf_get_iter_element(&iter))); } if (set->fixedSpaceAllocation > 0) { /* check that we can achieve the fixed size, possibly using a filler */ CHK_ORET(setSize == set->fixedSpaceAllocation || (setSize < set->fixedSpaceAllocation && setSize + mxf_get_min_llen(mxfFile) + mxfKey_extlen <= set->fixedSpaceAllocation)); if (setSize < set->fixedSpaceAllocation) { /* add filler */ CHK_ORET(mxf_write_fill(mxfFile, (uint32_t)(set->fixedSpaceAllocation - setSize))); } } return 1; }
int mxf_allocate_space(MXFFile *mxfFile, uint32_t size) { uint64_t fillSize; uint8_t llen; CHK_ORET(size >= (uint32_t)(mxf_get_min_llen(mxfFile) + mxfKey_extlen)); CHK_ORET(mxf_write_k(mxfFile, &g_KLVFill_key)); fillSize = size - mxfKey_extlen; llen = mxf_get_llen(mxfFile, fillSize); assert(fillSize >= llen); fillSize -= llen; CHK_ORET(mxf_write_l(mxfFile, fillSize)); CHK_ORET(mxf_write_zeros(mxfFile, fillSize)); return 1; }