IFF
- Extensions: 8svx, 16sv, ilbm, anim
- MIME Types:
- 8svx: audio/8svx, audio/x-8svx
- 16sv: audio/16sv, audio/x-16sv
- ilbm: image/ilbm, image/x-ilbm
- anim: video/anim, video/x-anim
- Specification:
- Original Electronic Arts specification january 14 1985.
IFF (Interchange File Format) is a format developed by electronic arts in the 80's. It is the predominant format on the Amiga computer. It is a chunked format. It can be used to store any type of data, but it is predominantly used to store images, animations and audio.
Implementations
- xine has a demuxer/decoder for iff. Manfred Tremmel the author of the xine code has agreed to relicence his xine code as LGPL to allow easier use in ffmpeg. Thanks Manfred.
- Werner Randelshofer the author of multishow has also granted permission for his iff code to be relicenced as LGPL. Thanks Werner.
- Xanim also contains code to support iff, it may contain some formats not available in xine.
- libiffanim supports lots of animation formats http://www-user.tu-chemnitz.de/~womar/projects/iffanim/
- Virtualdub contains a demuxer/decoder also, look in the file InputFileANIM.cpp
Generic Chunk Format
typedef struct {
char FOURCC[4];
int32_t chunk_size;
uint8_t data[size];
} IFF_chunk;
IFF chunks are always padded to an even number of bytes. The possible padding byte is not included in chunk_size.
Example of a chunked IFF file:
FORM
|
Table Of Chunks
Note: FOURCC's of less than four characters are padded with spaces.
| Group Identifiers | ||
|---|---|---|
| FOURCC | Standard | Description |
| CAT | EA85 | |
| END | unofficial | END-of-FORM identifier (see Amiga RKM Devices Ed. 3 page 376) |
| FORM | EA85 | |
| LIST | EA85 | |
| PROP | EA85 | |
| TREE | Storage of arbitrary data structures like trees and nested lists | |
| Text, annotations, et cetera | ||
| FOURCC | Standard | Description |
| (c) | EA85 | Copyright |
| ANNO | EA85 | Annotation |
| AUTH | EA85 | Author |
| CHRS | EA85 | Character String |
| CSET | Character Set | |
| FTXT | EA85 | Formatted Text |
| FVER | Amiga OS Version String | |
| HLID | private | HotLink IDentification (Soft-Logik) |
| JUNK | Ignore | |
| NAME | EA85 | Title of image, music, ... |
| OCMP | EA85, reserved | Computer Property |
| OCPU | EA85, reserved | CPU Property |
| OPGM | EA85, reserved | Program Property |
| OSN | EA85, reserved | Serial Number Property |
| PTXT | private, reserved | |
| TEXT | EA85 | Unformatted ASCII Text |
| UNAM | EA85, reserved | Username Property |
| VERS | File Version Number | |
| Graphics Forms | ||
| FOURCC | Standard | Description |
| ACBM | Amiga Contiguous Bitmap (AmigaBasic) | |
| CHBM | private | Chunky Bitmap |
| DCCL | private | DCTV Paint Clip |
| DCPA | private | DCTV Paint Palette |
| DCTV | private | DCTV Raw Picture |
| DEEP | Chunky Pixel Image Files (TV Paint) | |
| DR2D | 2D Object, Vector Graphics | |
| DRAW | reserved | Jim Bayless, 12/90 |
| DSDR | private | DrawStudio |
| GRYP | proposal | Byteplane Storage |
| ILBM | EA85 | Raster Bitmap Form |
| ILBM.* | See ILBM Chunks below | |
| OB3D | proposal | 3D Object |
| PBM | 256-Color Chunky Pixel | |
| PICS | EA85, reserved | Macintosh Picture |
| PICS.PICT | EA85, reserved | Macintosh Picture |
| PLBM | EA85, reserved | Obsolete |
| RGB4 | private | 4-bit RGB |
| RGB8 | RGB Image, Turbo Silver (Impulse) | |
| RGBN | RGB Image, Turbo Silver (Impulse) | |
| RGBX | private, reserved | |
| SC3D | private | 3D Scene, Sculpt-3D |
| TDDD | 3D Rendering Data, Turbo Silver (Impulse) | |
| YUVN | YUV Image Data, MacroSystems | |
| ILBM Chunks | ||
| FOURCC | Standard | Description |
| 3DCM | reserved | by Haitex |
| 3DPA | reserved | by Haitex |
| ABIT | ACBM Body | |
| ASDG | private | ASDG Application |
| BHBA | private | Photon Paint (brushes) |
| BHCP | private | Photon Paint (screens) |
| BHSM | private | Photon Paint |
| BMHD | EA85 | ILBM Bitmap Header |
| BODY | EA85 | Image Data |
| CAMG | Amiga Viewport Modes | |
| CCRT | Graphicraft Color Cycling | |
| CLUT | Color Lookup Table | |
| CMAP | EA85 | 8-bit RGB Color Map (packed array of ColorRegisters) |
| CMYK | CMYK Color Map (Soft-Logik) | |
| CNAM | Color Naming Chunk, providex names for CMAP and/or CMYK (Soft-Logik) | |
| CRNG | Color Cycling | |
| CTBL.DYCP | Newtek Dynamic Ham Color | |
| DCOL | unofficial | Direct Color |
| DCTV | reserved | |
| DEST | Destination Image Info | |
| DGVW | private | Newtek DigiView |
| DLTA | Image Data | |
| DPI | Dots Per Inch | |
| DPPV | DPaint Perspective (EA) | |
| DRNG | DPaint IV Enhanced Color Cycling (EA) | |
| EPSF | Encapsulated Postscript | |
| FAX3 | private | GPSoftware FAX |
| FAXX | Fascimile Image | |
| FAXX.GPHD | Additional Header Info for FAXX forms | |
| GRAB | Hotspot Coordinates | |
| MFAX | private, reserved | TKR GmbH & Co. |
| PCHG | Line-by-line Palette Control Information | |
| PRVW | proposal | Preview (thumbnail) |
| SHAM | Sliced HAM Color | |
| SPRT | Sprite Identifier | |
| TMAP | reserved | Transparency Map |
| VTAG | proposal | Viewmode Tags |
| XBMI | Extended Bitmap Information (Soft-Logik) | |
| XSSL | Identifier for 3D X-Specs Image (Haitex) | |
| Audio and Music | ||
| FOURCC | Standard | Description |
| 16SV | ||
| 8SVX | EA85 | 8-bit Sound Sample |
| 8SVX.CHAN.PAN | Stereo chunks | |
| 8SVX.SEQN.FADE | Looping chunks | |
| AHIM | private | AHI Modes |
| AHIM.AUDN | private | Audio Driver Name |
| AHIM.AUDD | private | Audio Driver Data |
| AHIM.AUDM | private | Audio Mode |
| AIFF | Audio 1-32 bit Samples | |
| BANK | private | Soundquest Editor/Librarian MIDI Sysex Dump |
| CELP | proposal | Compressed ZyXEL Voice Data |
| CMUS | proposal | Common Musical Score |
| GSCR | EA85 | General Music Score |
| MIDI | private | Circum Design |
| MSCX | private | Music-X Format |
| SAMP | Sampled Sound | |
| SYTH | private | SoundQuest Master Librarian MIDI System Driver |
| TRKR | proposal | MOD Tracker Music |
| USCR | EA85, reserved | Uhuru Score |
| UVOX | EA85, reserved | Uhuru Mac Voice |
| Fonts | ||
| FOURCC | Standard | Description |
| CPFM | private | Cloanto Personal Fontmaker |
| FNTR | EA85, reserved | Raster Font |
| FNTV | EA85, reserved | Vector Font |
| Animation and Movies | ||
| FOURCC | Standard | Description |
| AHAM | private | |
| ANBM | Animated Bitmap (Framer, Deluxe Video) | |
| ANHD | ANIM Frame | |
| ANIM | Cel Animation | |
| ANIM.brush | Brushes | |
| ANIM.op6 | Stereo, 3D Animation | |
| ANIM.op7 | private, unregistered | |
| ANIM.op8 | ||
| DPAN | Deluxe Paint Animation | |
| FANT | Fantavision Movie | |
| FIGR | private | Deluxe Video |
| FILM | private | Store ILBM's with interleaved 8SVX audio |
| JMOV | private, reserved | Merging Technologies |
| MOVI | private | LIST MOVI |
| ROXN | private | |
| VDEO | private | Deluxe Video |
| YAFA | private, unregistered | Wildfire Animation |
| Unclassified, unknown, et cetera | ||
| FOURCC | Standard | Description |
| ANFI | ||
| ANSQ | ||
| ARC | proposal | Archive Format |
| ARES | private, unregistered | |
| ATXT | reserved | |
| ATAK | ||
| AVCF | private | AmigaVision Flow format |
| BBSD | private | BBS Database, F. Patnaude, Jr., Phalanx Software |
| C100 | private | Cloanto Italiaformat |
| CLIP | private | CAT CLIP, holds various clipboard formats |
| DECK | private | Inovatronics CanDo |
| DOC | private | PageStream |
| DPPS | ||
| DTYP | DataTypes Identification | |
| EXEC | proposal | Executable Code |
| FACE | ||
| FRED | private | ASDG Global Chunk |
| GMS | Gesture and Motion Signal (see libGMS) | |
| GUI | proposal, private | Graphical User Interface Storage |
| HEAD | Flow Idea Processor, New Horizons Software | |
| IMRT | ||
| INFO | proposal | Contains data usually found in .info file |
| INS1 | ||
| IOBJ | private, reserved | Seven Seas Software |
| IODK | private, reserved | Jean-Marc Porchet, Merging Technologies |
| ITRF | private, reserved | |
| MHDR | ||
| MSMP | reserved | |
| MTRX | Numerical Data Storage, MathVision - Seven Seas | |
| NSEQ | private | Numerical Sequence, Stockhausen GmbH |
| PGTB | Program Traceback (SAS Institute) | |
| PMBC | proposal, reserved | Black Belt System, 1991-12-01 |
| PREF | private, reserved | Commodore, User Preferences |
| PREF.AHI | private | AHI Global Preferences |
| PREF.AHIU | private | AHI Unit Preferences |
| PRSP | DPaint IV Perspective Move | |
| PTCH | private | Patch File, SAS Institute |
| RLSE | ||
| SHAK | private | Shakespeare Format |
| SHDR | ||
| SHO1 | private, reserved | Gary Bonham |
| SHOW | private, reserved | Gary Bonham |
| SPLT | ASDG's File Splitting System | |
| SSRE | private, reserved | Merging Technologies, 1992-05-04 |
| SWRT | private, unregistered | |
| TCDE | private, reserved | Merging Technologies |
| TERM | private, unregistered | |
| TINY | ||
| TMUI | Toolmaker IFF Project (Toolmaker v1.19) | |
| TRAK | ||
| VHDR | ||
| WORD | ProWrite Document, New Horizons | |
| WOWO | private, unregistered | Wordworth |
Chunks Internals
Described below is how the data part of specific chunks are to be interpreted.
BMHD
Images are stored in planes. So, to get a pixels color value you need to combine the bits from each plane to create a color register index.
typedef struct {
uint16_t w; /* raster width in pixels */
uint16_t h; /* raster height in pixels */
int16_t x; /* x offset in pixels */
int16_t y; /* y offset in pixels */
uint8_t nplanes; /* # source bitplanes */
uint8_t masking; /* masking technique, 0 = mskNone, 1 = mskHasMask, 2 = mskHasTransparentColor, 3 = mskLasso */
uint8_t compression; /* compression algoithm, 0 = cmpNone, 1 = cmpByteRun1 */
uint8_t pad1; /* UNUSED. For consistency, put 0 here. */
uint16_t transparentColor; /* transparent "color number" */
uint8_t xaspect; /* aspect ratio, a rational number x/y */
uint8_t yaspect; /* aspect ratio, a rational number x/y */
int16_t pagewidth; /* source "page" size in pixels */
int16_t pageheight; /* source "page" size in pixels */
} BitMapHeader;
BODY
The BODY's content is a concatenation of scanlines. Each scanline consists of one row of data for each plane, starting at plane 0, followed by one row of masking data (if BMHD.maskinh = mskHasMask). If BMHD.compression = cmpNone, all h rows are exactly ceil(w/16) uint16_t's wide.
ByteRun1 Algorithm
0 <= x <= 127 x+1 literals -127 <= x <= -1 -x+1 times next byte -128 unused
Each row of each scanline is compressed separately.
CAMG
typedef int32_t viewportMode;
CMAP
typedef struct {
struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} colormap[chunk_size / 3];
} ColorMap;
CCRT
typedef struct {
int16_t direction; /* 0 = none, >0 = forwards, <0 = backwards */
uint8_t start; /* lower... */
uint8_t end; /* ...and upper color registers */
int32_t seconds; /* seconds between cycles */
int32_t microseconds; /* microseconds between cycles */
int16_t pad; /* 0 */
} CycleInfo;
CRNG
typedef struct {
int16_t pad1; /* 0 */
int16_t rate; /* color cycle rate, 16384 = 60Hz */
int16_t active; /* 0 = off, >0 = on */
uint8_t low; /* lower... */
uint8_t high; /* ...and upper color registers */
} CRange;
DEST
typedef struct {
uint8_t depth; /* # bitplanes in the original source */
uint8_t pad1; /* 0 */
uint16_t planePick; /* how to scatter source bitplanes into destination */
uint16_t planeOnOff; /* default bitplane data for planePick */
uint16_t planeMask; /* which bitplanes to store into
} DestMerge;
GRAB
Hotspot, relative to the upper left corner. Think mouse cursor or paint brush.
typedef struct {
int16_t x;
int16_t y;
} Point2D;
SPRT
typedef uint16_t SpritePrecedence; /* relative precedence; 0 is highest */