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; }