The use, by default, of signed 16-bit integer and signed 8-bit byte numbers for parameter and data storage in C3D files is, in part, a consequence of using FORTRAN to create most of the original C3D applications, as well as a desire to keep the format relatively simple.
However, in many cases, the use of signed numbers limits the amount of data that can be stored in the C3D file, the size of C3D parameters and the size of parameter arrays. For instance, according to the formal C3D specification, the maximum number of 3D frames that can be stored in a C3D file is 32,767 – a result of the use of a signed 16-bit signed integer parameter (POINT:FRAMES) to record the number of 3D frames stored in the file. This limits the length of 3D data that can be recorded in the C3D file to just over 9 minutes at 60Hz (32767 / (60 * 60)) or correspondingly less at higher 3D frame rates. This limitation is complicated by the use of signed 16-bit signed integers in the C3D file header to record the starting and ending frame numbers. As a result, if the first 3D frame number is not 1, the total length of time available for the C3D frame storage is proportionally reduced based on the C3D file header limitations (these values are not stored in the parameter section).
The use of an 8-bit pointer to locate the start of the parameter section and a 16-bit signed integer to record the start of the 3D data section also places some limits of the C3D file structure:
· The 8-bit pointer to the start of the parameter section limits the placement of the start of the parameter section to any 512-byte block within the first range of 1 to 127 – effectively within 64kB (127*512/1024) of the start of the C3D file.
· The start of 3D data is recorded by a signed 16-bit integer parameter (POINT:DATA_START) that points to the location of the first 512-byte block used to store 3D point and/or analog data. This limits the placement of the start of 3D data storage to any 512-byte block boundary within the first 16Mb (32767*512/1024) of the C3D file.
The size of parameter dimensions is limited by the use of a signed byte as a pointer or index within the parameter records. Parameters cannot contain more than 127 characters or have more than 127 separate values, in any one dimension etc.