Copyright 2012-04-26 Werner Randelshofer

org.monte.media.anim
Class ANIMDecoder

java.lang.Object
  extended by org.monte.media.anim.ANIMDecoder
All Implemented Interfaces:
IFFVisitor

public class ANIMDecoder
extends java.lang.Object
implements IFFVisitor

Decodes IFF files and adds the data to an ANIMMovieTrack.

Version:
2.3 2011-07-21 Treats CMAP specially if OCS chip set is detected.
2.1 2010-04-11 Adds support for CCRT color cycling.
2.1 2010-01-22 Adds support for CRNG color cycling.
2.0 2009-12-25 Treat an ILBM file as an animation with a single frame.
1.3 2009-12-24 Added support for CRNG color cycling.
1.2.1 2006-09-30 Decode CMAP even if it is too big or too small for the number of bitplanes used of the animation.
1.2 2003-04-21 Decode ANFI revised.
1.0 2003-04-03 Support for ANIM+SLA (Animations with Statically Loaded Audio) files added.
1.0 1999-10-19
Author:
Werner Randelshofer, Hausmatt 10, CH-6405 Immensee, Switzerland

Field Summary
static int A2024_MONITOR_ID
          A2024, 60fps (I don't know the real value).
static int DBLNTSC_MONITOR_ID
          DBLNTSC, 58fps, 44:52.
static int DBLPAL_MONITOR_ID
          DBLPAL, 48fps, 44:44.
static int DEFAULT_MONITOR_ID
          Default ID chooses a system dependent screen mode.
protected static int EHB_MODE
           
static int EURO36_MONITOR_ID
          EURO36, 73fps, 44:44.
static int EURO72_MONITOR_ID
          EURO72, 69fps, 44:44.
protected static int HAM_MODE
           
protected static int MODE_MASK
           
static int MONITOR_ID_MASK
          CAMG monitor ID mask.
static int MULTISCAN_MONITOR_ID
          MULTISCAN (VGA), 58fps, 44:44.
static int NTSC_MONITOR_ID
          NTSC, 60fps, 44:52.
static int PAL_MONITOR_ID
          PAL, 50fps, 44:44.
static int PROTO_MONITOR_ID
          PROTO, 60fps (I don't know the real value).
static int SUPER72_MONITOR_ID
          SUPER72, 71fps, 34:40.
 
Constructor Summary
ANIMDecoder(java.io.InputStream inputStream)
           
ANIMDecoder(java.net.URL location)
           
 
Method Summary
protected  void decodeANNO(IFFChunk[] chunks, ANIMMovieTrack track)
           
protected  void decodeAUTH(IFFChunk[] chunks, ANIMMovieTrack track)
           
protected  void decodeCCRT(IFFChunk chunk, ANIMMovieTrack track)
          Decodes the color cycling range and timing chunk (ILBM CCRT).
protected  void decodeColorCycling(IFFChunk[] ccrtChunks, IFFChunk[] crngChunks, IFFChunk[] drngChunks, ANIMMovieTrack track)
          Process CRNG and DRNG chunks in the sequence of their location in the file.
protected  void decodeCOPYRIGHT(IFFChunk[] chunks, ANIMMovieTrack track)
           
protected  void decodeCRNG(IFFChunk chunk, ANIMMovieTrack track)
          Decodes the color range cycling (ILBM CRNG).
protected  void decodeDRNG(IFFChunk chunk, ANIMMovieTrack track)
          Decodes the DPaint IV enhanced color cycle chunk (ILBM DRNG)
 void enterGroup(IFFChunk chunk)
           
 void leaveGroup(IFFChunk chunk)
           
 void produce(ANIMMovieTrack track, int n, boolean loadAudio)
          Decodes the stream and produces animation frames into the specified movie track.
 void registerChunks(IFFParser iff, boolean loadAudio)
           
 void visitChunk(IFFChunk group, IFFChunk chunk)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

MONITOR_ID_MASK

public static final int MONITOR_ID_MASK
CAMG monitor ID mask.

See Also:
Constant Field Values

DEFAULT_MONITOR_ID

public static final int DEFAULT_MONITOR_ID
Default ID chooses a system dependent screen mode. We always fall back to NTSC OCS with 60fps. The default monitor ID triggers OCS mode! OCS stands for "Original Chip Set". The OCS chip set only had 4 bits per color register. All later chip sets hat 8 bits per color register.

See Also:
Constant Field Values

NTSC_MONITOR_ID

public static final int NTSC_MONITOR_ID
NTSC, 60fps, 44:52.

See Also:
Constant Field Values

PAL_MONITOR_ID

public static final int PAL_MONITOR_ID
PAL, 50fps, 44:44.

See Also:
Constant Field Values

MULTISCAN_MONITOR_ID

public static final int MULTISCAN_MONITOR_ID
MULTISCAN (VGA), 58fps, 44:44.

See Also:
Constant Field Values

A2024_MONITOR_ID

public static final int A2024_MONITOR_ID
A2024, 60fps (I don't know the real value).

See Also:
Constant Field Values

PROTO_MONITOR_ID

public static final int PROTO_MONITOR_ID
PROTO, 60fps (I don't know the real value).

See Also:
Constant Field Values

EURO72_MONITOR_ID

public static final int EURO72_MONITOR_ID
EURO72, 69fps, 44:44.

See Also:
Constant Field Values

EURO36_MONITOR_ID

public static final int EURO36_MONITOR_ID
EURO36, 73fps, 44:44.

See Also:
Constant Field Values

SUPER72_MONITOR_ID

public static final int SUPER72_MONITOR_ID
SUPER72, 71fps, 34:40.

See Also:
Constant Field Values

DBLNTSC_MONITOR_ID

public static final int DBLNTSC_MONITOR_ID
DBLNTSC, 58fps, 44:52.

See Also:
Constant Field Values

DBLPAL_MONITOR_ID

public static final int DBLPAL_MONITOR_ID
DBLPAL, 48fps, 44:44.

See Also:
Constant Field Values

MODE_MASK

protected static final int MODE_MASK
See Also:
Constant Field Values

HAM_MODE

protected static final int HAM_MODE
See Also:
Constant Field Values

EHB_MODE

protected static final int EHB_MODE
See Also:
Constant Field Values
Constructor Detail

ANIMDecoder

public ANIMDecoder(java.io.InputStream inputStream)

ANIMDecoder

public ANIMDecoder(java.net.URL location)
Method Detail

produce

public void produce(ANIMMovieTrack track,
                    int n,
                    boolean loadAudio)
             throws java.io.IOException
Decodes the stream and produces animation frames into the specified movie track. Reads the n-th ANIM chunk out of the IFF-file.

Parameters:
track - The decoded data is stored in this track.
n - The index of the ANIM FORM to be read out of the IFF-File
loadAudio - If this is set to false, audio data will be skipped.
Throws:
java.io.IOException

registerChunks

public void registerChunks(IFFParser iff,
                           boolean loadAudio)

enterGroup

public void enterGroup(IFFChunk chunk)
Specified by:
enterGroup in interface IFFVisitor

leaveGroup

public void leaveGroup(IFFChunk chunk)
Specified by:
leaveGroup in interface IFFVisitor

visitChunk

public void visitChunk(IFFChunk group,
                       IFFChunk chunk)
                throws ParseException,
                       AbortException
Specified by:
visitChunk in interface IFFVisitor
Throws:
ParseException
AbortException

decodeCCRT

protected void decodeCCRT(IFFChunk chunk,
                          ANIMMovieTrack track)
                   throws ParseException
Decodes the color cycling range and timing chunk (ILBM CCRT).
 enum {
     dontCycle = 0, forward = 1, backwards = -1
 } ccrtDirection;
 typedef struct {
   WORD enum ccrtDirection direction;  // 0=don't cycle, 1=forward, -1=backwards
   UBYTE start;      // range lower
   UBYTE end;        // range upper
   ULONG  seconds;    // seconds between cycling
   ULONG  microseconds; // msecs between cycling
   WORD  pad;        // future exp - store 0 here
 } ilbmColorCyclingRangeAndTimingChunk;
 

Throws:
ParseException

decodeCRNG

protected void decodeCRNG(IFFChunk chunk,
                          ANIMMovieTrack track)
                   throws ParseException
Decodes the color range cycling (ILBM CRNG).
 #define RNG_NORATE  36   // Dpaint uses this rate to mean non-active
  set {
  active = 1, reverse = 2
  } crngActive;

  // A CRange is store in a CRNG chunk.
  typedef struct {
  WORD  pad1;              // reserved for future use; store 0 here *
  WORD  rate;              // 60/sec=16384, 30/sec=8192, 1/sec=16384/60=273
  WORD set crngActive flags;     // bit0 set = active, bit 1 set = reverse
  UBYTE low; UBYTE high;         // lower and upper color registers selected
  } ilbmColorRegisterRangeChunk;
 

Throws:
ParseException

decodeDRNG

protected void decodeDRNG(IFFChunk chunk,
                          ANIMMovieTrack track)
                   throws ParseException
Decodes the DPaint IV enhanced color cycle chunk (ILBM DRNG)

The RNG_ACTIVE flag is set when the range is cyclable. A range should only have the RNG _ACTIVE if it:

  1. contains at least one color register
  2. has a defined rate
  3. has more than one color and/or color register
 ILBM DRNG DPaint IV enhanced color cycle chunk
 --------------------------------------------

 set {
     RNG_ACTIVE=1,RNG_DP_RESERVED=4
 } drngFlags;

 /* True color cell * /
 typedef struct {
     UBYTE cell;
     UBYTE r;
     UBYTE g;
     UBYTE b;
 } ilbmDRNGDColor;

 /* Color register cell * /
 typedef struct {
     UBYTE cell;
     UBYTE index;
 } ilbmDRNGDIndex;

 /* DRNG chunk. * /
 typedef struct {
     UBYTE min; /* min cell value * /
     UBYTE max; /* max cell value * /
     UWORD rate; /* color cycling rate, 16384 = 60 steps/second * /
     UWORD set drngFlags flags; /* 1=RNG_ACTIVE, 4=RNG_DP_RESERVED * /
     UBYTE ntrue; /* number of DColorCell structs to follow * /
     UBYTE ntregs; /* number of DIndexCell structs to follow * /
     ilbmDRNGDColor[ntrue] trueColorCells;
     ilbmDRNGDIndex[ntregs] colorRegisterCells;
 } ilbmDRangeChunk;
 

Throws:
ParseException

decodeColorCycling

protected void decodeColorCycling(IFFChunk[] ccrtChunks,
                                  IFFChunk[] crngChunks,
                                  IFFChunk[] drngChunks,
                                  ANIMMovieTrack track)
                           throws ParseException
Process CRNG and DRNG chunks in the sequence of their location in the file.

Throws:
ParseException

decodeCOPYRIGHT

protected void decodeCOPYRIGHT(IFFChunk[] chunks,
                               ANIMMovieTrack track)
                        throws ParseException
Throws:
ParseException

decodeAUTH

protected void decodeAUTH(IFFChunk[] chunks,
                          ANIMMovieTrack track)
                   throws ParseException
Throws:
ParseException

decodeANNO

protected void decodeANNO(IFFChunk[] chunks,
                          ANIMMovieTrack track)
                   throws ParseException
Throws:
ParseException

Copyright 2012-04-26 Werner Randelshofer