1999-06-22 15:49:20 -03:00
|
|
|
\section{\module{chunk} ---
|
1999-06-25 14:52:17 -03:00
|
|
|
Read IFF chunked data}
|
1999-06-22 15:49:20 -03:00
|
|
|
|
|
|
|
\declaremodule{standard}{chunk}
|
1999-06-25 14:52:17 -03:00
|
|
|
\modulesynopsis{Module to read IFF chunks.}
|
|
|
|
\moduleauthor{Sjoerd Mullender}{sjoerd@acm.org}
|
|
|
|
\sectionauthor{Sjoerd Mullender}{sjoerd@acm.org}
|
1999-06-22 15:49:20 -03:00
|
|
|
|
|
|
|
|
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
This module provides an interface for reading files that use EA IFF 85
|
|
|
|
chunks.\footnote{``EA IFF 85'' Standard for Interchange Format Files,
|
|
|
|
Jerry Morrison, Electronic Arts, January 1985.} This format is used
|
|
|
|
in at least the Audio\index{Audio Interchange File
|
|
|
|
Format}\index{AIFF}\index{AIFF-C} Interchange File Format
|
|
|
|
(AIFF/AIFF-C), the Real\index{Real Media File Format} Media File
|
|
|
|
Format\index{RMFF} (RMFF), and the
|
|
|
|
Tagged\index{Tagged Image File Format} Image File Format\index{TIFF}
|
|
|
|
(TIFF).
|
1999-06-22 15:49:20 -03:00
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
A chunk has the following structure:
|
1999-06-22 15:49:20 -03:00
|
|
|
|
|
|
|
\begin{tableiii}{c|c|l}{textrm}{Offset}{Length}{Contents}
|
|
|
|
\lineiii{0}{4}{Chunk ID}
|
|
|
|
\lineiii{4}{4}{Size of chunk in big-endian byte order, including the
|
|
|
|
header}
|
1999-06-25 14:52:17 -03:00
|
|
|
\lineiii{8}{\var{n}}{Data bytes, where \var{n} is the size given in
|
|
|
|
the preceeding field}
|
|
|
|
\lineiii{8 + \var{n}}{0 or 1}{Pad byte needed if \var{n} is odd and
|
|
|
|
chunk alignment is used}
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{tableiii}
|
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
The ID is a 4-byte string which identifies the type of chunk.
|
|
|
|
|
|
|
|
The size field (a 32-bit value, encoded using big-endian byte order)
|
|
|
|
gives the size of the whole chunk, including the 8-byte header.
|
1999-06-22 15:49:20 -03:00
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
Usually an IFF-type file consists of one or more chunks. The proposed
|
|
|
|
usage of the \class{Chunk} class defined here is to instantiate an
|
|
|
|
instance at the start of each chunk and read from the instance until
|
|
|
|
it reaches the end, after which a new instance can be instantiated.
|
|
|
|
At the end of the file, creating a new instance will fail with a
|
|
|
|
\exception{EOFError} exception.
|
1999-06-22 15:49:20 -03:00
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
\begin{classdesc}{Chunk}{file\optional{, align}}
|
|
|
|
Class which represents a chunk. The \var{file} argument is expected
|
|
|
|
to be a file-like object. An instance of this class is specifically
|
|
|
|
allowed. The only method that is needed is \method{read()}. If the
|
|
|
|
methods \method{seek()} and \method{tell()} are present and don't
|
|
|
|
raise an exception, they are also used. If these methods are present
|
|
|
|
and raise an exception, they are expected to not have altered the
|
|
|
|
object. If the optional argument \var{align} is true, chunks are
|
|
|
|
assumed to be aligned on 2-byte boundaries. If \var{align} is
|
|
|
|
false, no alignment is assumed. The default value is true.
|
|
|
|
\end{classdesc}
|
|
|
|
|
|
|
|
A \class{Chunk} object supports the following methods:
|
1999-06-22 15:49:20 -03:00
|
|
|
|
|
|
|
\begin{methoddesc}{getname}{}
|
1999-06-25 14:52:17 -03:00
|
|
|
Returns the name (ID) of the chunk. This is the first 4 bytes of the
|
|
|
|
chunk.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}{close}{}
|
1999-06-25 14:52:17 -03:00
|
|
|
Close and skip to the end of the chunk. This does not close the
|
|
|
|
underlying file.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
The remaining methods will raise \exception{IOError} if called after
|
|
|
|
the \method{close()} method has been called.
|
|
|
|
|
1999-06-22 15:49:20 -03:00
|
|
|
\begin{methoddesc}{isatty}{}
|
1999-06-25 14:52:17 -03:00
|
|
|
Returns \code{0}.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
\begin{methoddesc}{seek}{pos\optional{, whence}}
|
|
|
|
Set the chunk's current position. The \var{whence} argument is
|
|
|
|
optional and defaults to \code{0} (absolute file positioning); other
|
|
|
|
values are \code{1} (seek relative to the current position) and
|
|
|
|
\code{2} (seek relative to the file's end). There is no return value.
|
|
|
|
If the underlying file does not allow seek, only forward seeks are
|
|
|
|
allowed.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}{tell}{}
|
1999-06-25 14:52:17 -03:00
|
|
|
Return the current position into the chunk.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
1999-06-25 14:52:17 -03:00
|
|
|
\begin{methoddesc}{read}{\optional{size}}
|
|
|
|
Read at most \var{size} bytes from the chunk (less if the read hits
|
|
|
|
the end of the chunk before obtaining \var{size} bytes). If the
|
|
|
|
\var{size} argument is negative or omitted, read all data until the
|
|
|
|
end of the chunk. The bytes are returned as a string object. An
|
|
|
|
empty string is returned when the end of the chunk is encountered
|
|
|
|
immediately.
|
1999-06-22 15:49:20 -03:00
|
|
|
\end{methoddesc}
|
|
|
|
|
|
|
|
\begin{methoddesc}{skip}{}
|
|
|
|
Skip to the end of the chunk. All further calls to \method{read()}
|
|
|
|
for the chunk will return \code{''}. If you are not interested in the
|
|
|
|
contents of the chunk, this method should be called so that the file
|
|
|
|
points to the start of the next chunk.
|
|
|
|
\end{methoddesc}
|