Example #1
0
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;
}
Example #2
0
/* 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;
}