Пример #1
0
void read_vertices (char filename [255])
   /* reads the vertices from the specified file to the global variable G_Vertices and  */
   /* sets G_n and G_d                                                                  */
   /* The file must contain the vertices in the following polyhedra format of Avis and  */
   /* Fukuda:                                                                           */
   /* comments                                                                          */
   /* begin                                                                             */
   /* number of vertices n  dimension + 1   type of coordinates                         */
   /* 1   v1                                                                            */
   /*   ...                                                                             */
   /* 1   vn                                                                            */
   /* end or any other text (is ignored)                                                */

{  FILE     *f;
   int      i, j;
   T_Vertex *v;
   char     data_type_string [255];
   int      data_type;

   G_Vertices = create_empty_set ();
   f = open_read (filename);
   fscanf (f, "%i %i %s ", &G_n, &G_d, data_type_string);
   G_d --;
   data_type = determine_data_type (data_type_string);
   if (data_type == RATIONAL_T)
   {  fprintf (stderr, "\n***** WARNING: The vertex file is of rational type; the ");
      fprintf (stderr, "vertex coordinates\nwill be transformed to floating point ");
      fprintf (stderr, "values.\n");
   }

   for (i = 0; i < G_n; i++)
   {  v = create_vertex ();
      fscanf (f, "%*i "); /* skips the entry one */
      v -> no = i; /* this assures v to be added at the end of the list */
      if (data_type == REAL_T)
         for (j = 0; j < G_d; j++)
            fscanf (f, "%lg ", &(v -> coords [j]));
      else
         for (j = 0; j < G_d; j++)
            fread_rational_value (f, &(v -> coords [j]));
      add_element (&G_Vertices, v);
   };
   fclose (f);
}
Пример #2
0
int mxf_create_set(MXFHeaderMetadata* headerMetadata, const mxfKey* key, MXFMetadataSet** set)
{
    MXFMetadataSet* newSet;
    mxfUUID uuid;
    
    CHK_ORET(create_empty_set(key, &newSet));
    
    mxf_generate_uuid(&uuid);
    newSet->instanceUID = uuid;

    CHK_OFAIL(mxf_add_set(headerMetadata, newSet));

    CHK_OFAIL(mxf_set_uuid_item(newSet, &MXF_ITEM_K(InterchangeObject, InstanceUID), &uuid));
    
    *set = newSet;
    return 1;
    
fail:
    mxf_free_set(&newSet);
    return 0;
}
Пример #3
0
int mxf_read_and_return_set(MXFFile* mxfFile, const mxfKey* key, uint64_t len,
    MXFHeaderMetadata* headerMetadata, int addToHeaderMetadata, MXFMetadataSet** set)
{
    MXFMetadataSet* newSet = NULL;
    MXFSetDef* setDef = NULL;
    uint64_t totalLen = 0;
    mxfLocalTag itemTag;
    uint16_t itemLen;
    int haveInstanceUID = 0;
    mxfKey itemKey;
    MXFItemDef* itemDef = NULL;
    MXFMetadataItem* newItem;

    assert(headerMetadata->primerPack != NULL);

    /* only read sets with known definitions */    
    if (mxf_find_set_def(headerMetadata->dataModel, key, &setDef))
    {
        CHK_ORET(create_empty_set(key, &newSet));
    
        /* read each item in the set*/
        haveInstanceUID = 0;
        do
        {
            CHK_OFAIL(mxf_read_item_tl(mxfFile, &itemTag, &itemLen));
            /* check the item tag is registered in the primer */
            if (mxf_get_item_key(headerMetadata->primerPack, itemTag, &itemKey))
            {
                /* only read items with known definition */
                if (mxf_find_item_def_in_set_def(&itemKey, setDef, &itemDef))
                {
                    CHK_OFAIL(mxf_create_item(newSet, &itemKey, itemTag, &newItem));
                    newItem->isPersistent = 1;
                    CHK_OFAIL(mxf_read_item(mxfFile, newItem, itemLen));
                    if (mxf_equals_key(&MXF_ITEM_K(InterchangeObject, InstanceUID), &itemKey))
                    {
                        mxf_get_uuid(newItem->value, &newSet->instanceUID);
                        haveInstanceUID = 1;
                    }
                }
                /* skip items with unknown definition */
                else
                {
                    CHK_OFAIL(mxf_skip(mxfFile, (int64_t)itemLen));
                }
            }
            /* skip items not registered in the primer. Log warning because the file is invalid */
            else
            {
                mxf_log_warn("Encountered item with tag %d not registered in the primer" LOG_LOC_FORMAT,
                    itemTag, LOG_LOC_PARAMS);
                CHK_OFAIL(mxf_skip(mxfFile, (int64_t)itemLen));
            }
            
            totalLen += 4 + itemLen;        
        }
        while (totalLen < len);
        
        if (totalLen != len)
        {
            mxf_log_error("Incorrect metadata set length encountered" LOG_LOC_FORMAT, LOG_LOC_PARAMS);
            goto fail;
        }
        if (!haveInstanceUID)
        {
            mxf_log_error("Metadata set does not have InstanceUID item" LOG_LOC_FORMAT, LOG_LOC_PARAMS);
            goto fail;
        }

        /* ok to add set */
        if (addToHeaderMetadata)
        {
            CHK_OFAIL(mxf_add_set(headerMetadata, newSet));
        }
    
        *set = newSet;
        return 1;
    }

    /* skip the set if the def is unknown */
    CHK_ORET(mxf_skip(mxfFile, (int64_t)len));
    *set = NULL;
    return 2;

fail:
    mxf_free_set(&newSet);
    return 0;    
}