Ejemplo n.º 1
0
int mxf_create_list(MXFList **list, free_func_type freeFunc)
{
    MXFList *newList;

    CHK_MALLOC_ORET(newList, MXFList);
    mxf_initialise_list(newList, freeFunc);

    *list = newList;
    return 1;
}
Ejemplo n.º 2
0
int mxf_create_partition(MXFPartition **partition)
{
    MXFPartition *newPartition;

    CHK_MALLOC_ORET(newPartition, MXFPartition);
    mxf_initialise_partition(newPartition);

    *partition = newPartition;
    return 1;
}
Ejemplo n.º 3
0
static int create_essence_element(const mxfKey *key, uint8_t llen, MXFEssenceElement **essenceElement)
{
    MXFEssenceElement *newEssenceElement = NULL;

    CHK_MALLOC_ORET(newEssenceElement, MXFEssenceElement);
    memset(newEssenceElement, 0, sizeof(MXFEssenceElement));
    newEssenceElement->key = *key;
    newEssenceElement->llen = llen;

    *essenceElement = newEssenceElement;
    return 1;
}
Ejemplo n.º 4
0
static int create_empty_set(const mxfKey* key, MXFMetadataSet** set)
{
    MXFMetadataSet* newSet;
    
    CHK_MALLOC_ORET(newSet, MXFMetadataSet);
    memset(newSet, 0, sizeof(MXFMetadataSet));
    newSet->key = *key;
    newSet->instanceUID = g_Null_UUID;
    mxf_initialise_list(&newSet->items, free_metadata_item_in_list);

    *set = newSet;
    return 1;
}
Ejemplo n.º 5
0
int mxf_append_partition_esscont_label(MXFPartition *partition, const mxfUL *label)
{
    mxfUL *newLabel;

    CHK_MALLOC_ORET(newLabel, mxfUL);
    *newLabel = *label;
    CHK_OFAIL(mxf_append_list_element(&partition->essenceContainers, newLabel));

    return 1;

fail:
    SAFE_FREE(newLabel);
    return 0;
}
Ejemplo n.º 6
0
static int add_metadef_to_list(MXFList* list, const mxfUL* identification, const mxfUUID* instanceUID)
{
    MetaDefData* data = NULL;
    
    CHK_MALLOC_ORET(data, MetaDefData);
    data->identification = *identification;
    data->instanceUID = *instanceUID;
    
    CHK_OFAIL(mxf_append_list_element(list, (void*)data));
    data = NULL;
    
    return 1;
    
fail:
    SAFE_FREE(&data);
    return 0;
}
Ejemplo n.º 7
0
int mxf_create_from_partition(const MXFPartition *sourcePartition, MXFPartition **partition)
{
    MXFPartition *newPartition;

    CHK_MALLOC_ORET(newPartition, MXFPartition);
    if (!mxf_initialise_with_partition(sourcePartition, newPartition))
    {
        goto fail;
    }

    *partition = newPartition;
    return 1;

fail:
    mxf_free_partition(&newPartition);
    return 0;
}
Ejemplo n.º 8
0
int mxf_create_header_metadata(MXFHeaderMetadata** headerMetadata, MXFDataModel* dataModel)
{
    MXFHeaderMetadata* newHeaderMetadata;
    
    CHK_MALLOC_ORET(newHeaderMetadata, MXFHeaderMetadata);
    memset(newHeaderMetadata, 0, sizeof(MXFHeaderMetadata));
    newHeaderMetadata->dataModel = dataModel;
    mxf_initialise_list(&newHeaderMetadata->sets, free_metadata_set_in_list);
    CHK_OFAIL(mxf_create_primer_pack(&newHeaderMetadata->primerPack));
    
    *headerMetadata = newHeaderMetadata;
    return 1;   
    
fail:
    mxf_free_header_metadata(&newHeaderMetadata);
    return 0;
}
Ejemplo n.º 9
0
int mxf_page_file_open_new(const char *filenameTemplate, int64_t pageSize, MXFPageFile **mxfPageFile)
{
    MXFFile *newMXFFile = NULL;

    if (strstr(filenameTemplate, "%d") == NULL)
    {
        mxf_log_error("Filename template '%s' doesn't contain %%d\n", filenameTemplate);
        return 0;
    }

    CHK_MALLOC_ORET(newMXFFile, MXFFile);
    memset(newMXFFile, 0, sizeof(*newMXFFile));

    newMXFFile->close           = page_file_close;
    newMXFFile->read            = page_file_read;
    newMXFFile->write           = page_file_write;
    newMXFFile->get_char        = page_file_getchar;
    newMXFFile->put_char        = page_file_putchar;
    newMXFFile->eof             = page_file_eof;
    newMXFFile->seek            = page_file_seek;
    newMXFFile->tell            = page_file_tell;
    newMXFFile->is_seekable     = page_file_is_seekable;
    newMXFFile->size            = page_file_size;
    newMXFFile->free_sys_data   = free_page_file;


    CHK_MALLOC_OFAIL(newMXFFile->sysData, MXFFileSysData);
    memset(newMXFFile->sysData, 0, sizeof(*newMXFFile->sysData));

    CHK_OFAIL((newMXFFile->sysData->filenameTemplate = strdup(filenameTemplate)) != NULL);
    newMXFFile->sysData->pageSize = pageSize;
    newMXFFile->sysData->mode = WRITE_MODE;
    newMXFFile->sysData->mxfPageFile.mxfFile = newMXFFile;


    *mxfPageFile = &newMXFFile->sysData->mxfPageFile;
    return 1;

fail:
    if (newMXFFile != NULL)
    {
        mxf_file_close(&newMXFFile);
    }
    return 0;
}
Ejemplo n.º 10
0
static int add_weakref_to_list(MXFList* list, MXFMetadataItem* item, int arrayIndex, const mxfUL* targetIdentification)
{
    WeakRefData* data = NULL;
    
    CHK_MALLOC_ORET(data, WeakRefData);
    data->item = item;
    data->arrayIndex = arrayIndex;
    data->targetIdentification = *targetIdentification;
    
    CHK_OFAIL(mxf_append_list_element(list, (void*)data));
    data = NULL;
    
    return 1;
    
fail:
    SAFE_FREE(&data);
    return 0;
}
Ejemplo n.º 11
0
int mxf_mem_file_open_read(const unsigned char *data, int64_t size, int64_t virtualStartPos, MXFMemoryFile **mxfMemFile)
{
    MXFFile *newMXFFile = NULL;

    CHK_MALLOC_ORET(newMXFFile, MXFFile);
    memset(newMXFFile, 0, sizeof(*newMXFFile));

    newMXFFile->close           = mem_file_close;
    newMXFFile->read            = mem_file_read;
    newMXFFile->write           = mem_file_write;
    newMXFFile->get_char        = mem_file_getchar;
    newMXFFile->put_char        = mem_file_putchar;
    newMXFFile->eof             = mem_file_eof;
    newMXFFile->seek            = mem_file_seek;
    newMXFFile->tell            = mem_file_tell;
    newMXFFile->is_seekable     = mem_file_is_seekable;
    newMXFFile->size            = mem_file_size;
    newMXFFile->free_sys_data   = free_mem_file;


    CHK_MALLOC_OFAIL(newMXFFile->sysData, MXFFileSysData);
    memset(newMXFFile->sysData, 0, sizeof(*newMXFFile->sysData));

    newMXFFile->sysData->virtualStartPos    = virtualStartPos;
    newMXFFile->sysData->readOnly           = 1;
    newMXFFile->sysData->mxfMemFile.mxfFile = newMXFFile;


    CHK_MALLOC_OFAIL(newMXFFile->sysData->chunks, Chunk);

    newMXFFile->sysData->chunks->data      = (unsigned char*)data;
    newMXFFile->sysData->chunks->allocSize = size;
    newMXFFile->sysData->chunks->size      = size;
    newMXFFile->sysData->numChunks++;


    *mxfMemFile = &newMXFFile->sysData->mxfMemFile;
    return 1;

fail:
    if (newMXFFile)
        mxf_file_close(&newMXFFile);
    return 0;
}
Ejemplo n.º 12
0
int mxf_create_item(MXFMetadataSet* set, const mxfKey* key, mxfLocalTag tag, MXFMetadataItem** item)
{
    MXFMetadataItem* newItem;
    
    CHK_MALLOC_ORET(newItem, MXFMetadataItem);
    memset(newItem, 0, sizeof(MXFMetadataItem));
    newItem->tag = tag;
    newItem->isPersistent = 0;
    newItem->key = *key;

    CHK_OFAIL(add_item(set, newItem));
    
    *item = newItem;
    return 1;

fail:
    mxf_free_item(&newItem);
    return 0;
}
Ejemplo n.º 13
0
int mxf_append_list_element(MXFList *list, void *data)
{
    MXFListElement *newElement;

    CHK_ORET(list->len + 1 != MXF_LIST_NPOS);

    CHK_MALLOC_ORET(newElement, MXFListElement);
    memset(newElement, 0, sizeof(MXFListElement));
    newElement->data = data;

    if (!list->elements)
        list->elements = newElement;
    else
        list->lastElement->next = newElement;
    list->lastElement = newElement;

    list->len++;
    return 1;
}
Ejemplo n.º 14
0
int mxf_append_list_element(MXFList* list, void* data)
{
    MXFListElement* newElement;
    
    CHK_MALLOC_ORET(newElement, MXFListElement);
    memset(newElement, 0, sizeof(MXFListElement));
    newElement->data = data;

    if (list->elements == NULL)
    {
        list->elements = newElement;
    }
    else
    {
        list->lastElement->next = newElement;
    }
    list->lastElement = newElement;
    
    list->len++;
    return 1;
}
Ejemplo n.º 15
0
int xml_writer_open(const char* filename, XMLWriter** writer)
{
    XMLWriter* newWriter;
    
    CHK_MALLOC_ORET(newWriter, XMLWriter);
    memset(newWriter, 0, sizeof(XMLWriter));
    newWriter->previousWrite = ELEMENT_END;

    if ((newWriter->file = fopen(filename, "wb")) == NULL)
    {
        mxf_log_error("Failed to open xml file '%s'" LOG_LOC_FORMAT, filename, LOG_LOC_PARAMS);
        goto fail;
    }
    
    CHK_OFAIL(fprintf(newWriter->file, "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>") > 0);
    
    *writer = newWriter;
    return 1;
    
fail:
    SAFE_FREE(&newWriter);
    return 0;
}
Ejemplo n.º 16
0
int mxf_mem_file_open_new(uint32_t chunkSize, int64_t virtualStartPos, MXFMemoryFile **mxfMemFile)
{
    MXFFile *newMXFFile = NULL;

    CHK_MALLOC_ORET(newMXFFile, MXFFile);
    memset(newMXFFile, 0, sizeof(*newMXFFile));

    newMXFFile->close           = mem_file_close;
    newMXFFile->read            = mem_file_read;
    newMXFFile->write           = mem_file_write;
    newMXFFile->get_char        = mem_file_getchar;
    newMXFFile->put_char        = mem_file_putchar;
    newMXFFile->eof             = mem_file_eof;
    newMXFFile->seek            = mem_file_seek;
    newMXFFile->tell            = mem_file_tell;
    newMXFFile->is_seekable     = mem_file_is_seekable;
    newMXFFile->size            = mem_file_size;
    newMXFFile->free_sys_data   = free_mem_file;


    CHK_MALLOC_OFAIL(newMXFFile->sysData, MXFFileSysData);
    memset(newMXFFile->sysData, 0, sizeof(*newMXFFile->sysData));

    newMXFFile->sysData->chunkSize          = (chunkSize == 0 ? DEFAULT_CHUNK_SIZE : chunkSize);
    newMXFFile->sysData->virtualStartPos    = virtualStartPos;
    newMXFFile->sysData->mxfMemFile.mxfFile = newMXFFile;


    *mxfMemFile = &newMXFFile->sysData->mxfMemFile;
    return 1;

fail:
    if (newMXFFile)
        mxf_file_close(&newMXFFile);
    return 0;
}
Ejemplo n.º 17
0
int mxf_insert_list_element(MXFList* list, long index, int before, void* data)
{
    MXFListElement* newElement;
    MXFListElement* nextElement;
    MXFListElement* prevElement;
    long currentIndex;

    
    /* create new element */
    CHK_MALLOC_ORET(newElement, MXFListElement);
    memset(newElement, 0, sizeof(MXFListElement));
    newElement->data = data;

    /* special case when list is empty */
    if (list->elements == NULL)
    {
        list->elements = newElement;
        list->lastElement = newElement;
        list->len++;
        return 1;
    }
    
    nextElement = list->elements;
    prevElement = NULL;
    currentIndex = 0;
    if (before)
    {
        /* move to index position */
        while (currentIndex < index && nextElement != NULL)
        {
            prevElement = nextElement;
            nextElement = nextElement->next;
            currentIndex++;
        }
        if (currentIndex != index)
        {
            goto fail;
        }
    }
    else
    {
        /* move to after index position */
        while (currentIndex <= index && nextElement != NULL)
        {
            prevElement = nextElement;
            nextElement = nextElement->next;
            currentIndex++;
        }
        if (currentIndex != index + 1)
        {
            goto fail;
        }
    }
    
    /* insert element */
    if (prevElement == NULL)
    {
        list->elements = newElement;
    }
    else
    {
        prevElement->next = newElement;
    }
    newElement->next = nextElement;
    if (newElement->next == NULL)
    {
        list->lastElement = newElement;
    }
    
    list->len++;
    return 1;
    
fail:
    SAFE_FREE(&newElement);
    return 0;
}
Ejemplo n.º 18
0
int mxf_insert_list_element(MXFList *list, size_t index, int before, void *data)
{
    MXFListElement *newElement;
    MXFListElement *nextElement;
    MXFListElement *prevElement;
    size_t currentIndex;

    CHK_ORET(list->len + 1 != MXF_LIST_NPOS);
    if (index == MXF_LIST_NPOS)
        return 0;

    /* create new element */
    CHK_MALLOC_ORET(newElement, MXFListElement);
    memset(newElement, 0, sizeof(MXFListElement));
    newElement->data = data;

    /* special case when list is empty */
    if (!list->elements) {
        list->elements = newElement;
        list->lastElement = newElement;
        list->len++;
        return 1;
    }

    nextElement = list->elements;
    prevElement = NULL;
    currentIndex = 0;
    if (before) {
        /* move to index position */
        while (currentIndex < index && nextElement) {
            prevElement = nextElement;
            nextElement = nextElement->next;
            currentIndex++;
        }
        if (currentIndex != index)
            goto fail;
    } else {
        /* move to after index position */
        while (currentIndex <= index && nextElement) {
            prevElement = nextElement;
            nextElement = nextElement->next;
            currentIndex++;
        }
        if (currentIndex != index + 1)
            goto fail;
    }

    /* insert element */
    if (!prevElement)
        list->elements = newElement;
    else
        prevElement->next = newElement;
    newElement->next = nextElement;
    if (!newElement->next)
        list->lastElement = newElement;

    list->len++;
    return 1;

fail:
    SAFE_FREE(newElement);
    return 0;
}
Ejemplo n.º 19
0
int mxf_page_file_open_modify(const char *filenameTemplate, int64_t pageSize, MXFPageFile **mxfPageFile)
{
    MXFFile *newMXFFile = NULL;
    int pageCount;
    int allocatedPages;
    char filename[4096];
    FILE *file;
    int64_t fileSize;


    if (strstr(filenameTemplate, "%d") == NULL)
    {
        mxf_log_error("Filename template '%s' doesn't contain %%d\n", filenameTemplate);
        return 0;
    }

    /* count number of page files */
    pageCount = 0;
    for(;;)
    {
        mxf_snprintf(filename, sizeof(filename), filenameTemplate, pageCount);
        if ((file = fopen(filename, "rb")) == NULL)
        {
            break;
        }
        fclose(file);
        pageCount++;
    }

    if (pageCount == 0)
    {
        /* file not found */
        return 0;
    }

    /* check the size of the first file equals the pageSize */
    if (pageCount > 1)
    {
        mxf_snprintf(filename, sizeof(filename), filenameTemplate, 0);
        fileSize = disk_file_size(filename);
        if (fileSize < 0)
        {
            mxf_log_error("Failed to stat file '%s': %s\n", filename, strerror(errno));
            return 0;
        }
        if (pageSize != fileSize)
        {
            mxf_log_error("Size of first file '%s' (%"PRId64" does not equal page size %"PRId64"\n", filename, fileSize, pageSize);
            return 0;
        }
    }


    CHK_MALLOC_ORET(newMXFFile, MXFFile);
    memset(newMXFFile, 0, sizeof(*newMXFFile));

    newMXFFile->close           = page_file_close;
    newMXFFile->read            = page_file_read;
    newMXFFile->write           = page_file_write;
    newMXFFile->get_char        = page_file_getchar;
    newMXFFile->put_char        = page_file_putchar;
    newMXFFile->eof             = page_file_eof;
    newMXFFile->seek            = page_file_seek;
    newMXFFile->tell            = page_file_tell;
    newMXFFile->is_seekable     = page_file_is_seekable;
    newMXFFile->size            = page_file_size;
    newMXFFile->free_sys_data   = free_page_file;


    CHK_MALLOC_OFAIL(newMXFFile->sysData, MXFFileSysData);
    memset(newMXFFile->sysData, 0, sizeof(*newMXFFile->sysData));

    CHK_OFAIL((newMXFFile->sysData->filenameTemplate = strdup(filenameTemplate)) != NULL);
    newMXFFile->sysData->pageSize = pageSize;
    newMXFFile->sysData->mode = MODIFY_MODE;
    newMXFFile->sysData->mxfPageFile.mxfFile = newMXFFile;


    /* allocate pages */
    allocatedPages = (pageCount < PAGE_ALLOC_INCR) ? PAGE_ALLOC_INCR : pageCount;
    CHK_MALLOC_ARRAY_ORET(newMXFFile->sysData->pages, Page, allocatedPages);
    memset(newMXFFile->sysData->pages, 0, allocatedPages * sizeof(Page));
    newMXFFile->sysData->numPages = pageCount;
    newMXFFile->sysData->numPagesAllocated = allocatedPages;
    for (pageCount = 0; pageCount < newMXFFile->sysData->numPages; pageCount++)
    {
        newMXFFile->sysData->pages[pageCount].index = pageCount;
        newMXFFile->sysData->pages[pageCount].size = pageSize;
    }

    /* set the files size of the last file, which could have size < pageSize */
    mxf_snprintf(filename, sizeof(filename), filenameTemplate, newMXFFile->sysData->numPages - 1);
    fileSize = disk_file_size(filename);
    if (fileSize < 0)
    {
        mxf_log_error("Failed to stat file '%s': %s\n", filename, strerror(errno));
        goto fail;
    }
    newMXFFile->sysData->pages[newMXFFile->sysData->numPages - 1].size = fileSize;


    *mxfPageFile = &newMXFFile->sysData->mxfPageFile;
    return 1;

fail:
    if (newMXFFile != NULL)
    {
        mxf_file_close(&newMXFFile);
    }
    return 0;
}