Short:        MPEG video datatype V1.11
Author:       GISBURN@w-specht.rhein-ruhr.de (Roland Mainz)
Uploader:     GISBURN w-specht rhein-ruhr de (Roland Mainz)
Type:         util/dtype
Replaces:     util/dtype/mpvdtc0110.lha
Architecture: m68k-amigaos

MPEG video datatype, which is able to play mpeg 1 video streams.
animation.datatype subclass.

Version V1.11 (should be the LAST version of the MPEG-1-playing
               mpegvideo.datatype ;-(   )

New since V1.9
- Now supports CyberGFX 24/16 bit chunkypixel output
  (requires animation.datatype >= v41.3)

- Now supports 24 bit planar output
  (requires animation.datatype >= v41.4)

- Supports direct-from-disk decoding (using the NOLOADALL switch)
  (should only be used in conjunction with animation.datatype V41;
  an mc68060 would also be nice...)

- Now comes with full source (I removed all sources which couldn't be
  released in the past).

mpegvideo.datatype/--datasheed--             mpegvideo.datatype/--datasheed--

   NAME
       mpegvideo.datatype -- data type for mpeg video streams

   SUPERCLASS
       animation.datatype

   DESCRIPTION
       The mpegvideo data type, a sub-class of the animation.datatype, is
       used to load and play mpeg 1 video streams (Layer I).

   METHODS
       OM_NEW -- Create a new animation object from a description file. The
           source may only be a file.

       OM_DISPOSE -- Dispose instance and contents (frames, colormaps etc.),
           then pass msg to superclass

       OM_UPDATE -- Perform an ICM_CHECKLOOP check, and if succesfull, the
           method will be executed like OM_SET downstairs.

       OM_SET -- Pass msg to superclass, and if the mpegvideo.datatype
           instance is the "top instance", call GM_RENDER if retval from
           superclass was != 0UL.

       ADTM_LOADFRAME -- Fill in struct adtFrame with requested information
           from internal FrameNode list like bitmap, colormap, samples, etc..

       All other methods are passed unchanged to superclass.

   ATTRIBUTES
       Following attributes are set by the object and are READ-ONLY for
       applications:
       DTA_NominalHoriz        -- same as ADTA_Width
       DTA_NominalVert         -- same as ADTA_Height
       DTA_ObjName             -- same as DTA_Name
       ADTA_Width              -- set by video stream
       ADTA_Height             -- set by video stream
       ADTA_Depth              -- set by video stream (or by prefs)
       ADTA_NumColors          -- set by ADTA_Depth or to the num. of 
                                  palette entries
       ADTA_ColorRegisters     -- obj's palette with ADTA_NumColors entries
       ADTA_CRegs              -- obj's palette with ADTA_NumColors entries
       ADTA_Frames             -- total number of frames
       ADTA_FramesPerSecond    -- set by video stream
       ADTA_ModeID             -- calculated internally or set by prefs
       ADTA_KeyFrame           -- key frame
       ADTA_Sample             -- sample (optional, if a sample is attached)
       ADTA_SampleLength       -- sample length (optional, see ADTA_Sample)
       ADTA_Period             -- sample period (optional, see ADTA_Sample)
       ADTA_Volume             -- sample volume (optional, see ADTA_Sample)
       ADTA_Cycles             -- sample cycle  (optional, see ADTA_Sample)

   BUGS
       - If the mpeg video stream is not 100% standart conform,
         the decoder part of this datatype will CRASH your machine.
         Innocent memory will be overwritten !!

       - If you don't have my "paranimdtcpatch" patch running,
         animation.datatype (animation.datatype 40.7 (28.09.93)) subclasses
         will suffer under timing problems when two or more
         animation.datatype objetcs are playing. I've released a matching
         patch, DON'T blame me for this bug. Any comments for this problem
         should be related  to the "paranimdtcpatch" project.
         "paranimdtcpatch" is available in the aminet
         ("util/dtype/panimdtcptch012.LhA").
         NOTE that animation.datatype V41 does NOT require the patch
         anymore.

       - In large videos, the frames at the end will be played slower than
         those at the beginning of the file. This is the result of the
         sequential search internally used (only serious with more than 25000
         frames (mc68030/50mhz)).
         Will be fixed.

       - The LOADALL mode does not work perfectly. It sometimes "forgets" to
         fill some frames during loading.

       - The time code in the NOLODALL mode is slightly wrong (I assume up
         to +/- 6 frames).

       - The NOPFRAMES and NOBFRAMES options are incompatible with the
         NOLOADALL mode.

       - CyberGFX 24 bit output mode uses 32 bit ARGB bitmaps, but the A
         (alpha) byte is not set to 0xFF (visible), instead it is set to 0.
         The same for 15 bit output mode, where the MSB is a alpha mask bit.

   TODO
       - better error handling (and error messages)

       - code cleanup

       - bug fixing

       - Writing an amigaguide document

       - EHB

   HISTORY
       V1.1
         First (official) public release.

       V1.2
         Major code cleanup. I decided to rebuild the whole project from
         scratch instead of releasing my internal V1.8. The reason is that
         many things coded in it wasn't done with the required care. Now
         I try to fix this.

         - Sorry, but in the V1.1 release, I've forgotten the COPYRIGHT
           notice. Because I don't have the original ones (my code was a
           mergin of mpeg_play 1.X, 2.0, I've taken them from the
           mpeg_play 2.0 distribution).

         - Implemented the NOPFRAMES and NOBFRAMES switch (for those people
           who like it).

         - The loader now returns usefull return codes instead of failing
           silently.

         - Decrased the default depth from 7 to 5 planes. This is a more
           reliable default value for grayscale mpeg videos (screen or
           window).

         - Implemented "DICECOLOR" and "ORDERED" dithering.
           The options COLORERROR and DICESKIP are for fine-tuning
           speed <--> color output.

         - Introduced MAXFRAME (maximum number of frame to load) and
           SKIPFRAMES to allow loading of large videos.

         - MODEID option added (for those which don't like the default
           settings).

         - The datatypes descriptor file was WRONG. Now it should be correct.
           If not, send me a mail (and if possible, the sample file which
           won't work (packed with LhA for compression and CHECKSUMMING).
           (Later versions of the descriptor should use additional code
           to check the data).

       V1.3
         - COLOR output implemented.

         - DICECOLOR: Found a bug (?? very strange one ??) in my code which
           avoids the usage of a frame palette. DICECOLOR was intended
           to produce high-quality per frame color remapping instead using
           a global anim palette. Broken (e.g. working, but after a frame is
           finished, the color table isn't cleared for now...).

         - I found out that the most time is consumed by the WritePixelArray
           and copy functions. Later versions should contain a custom
           WritePixelArray replacement which should be able to write directly
           into FAST-RAM instead of writing into CHIP-RAM and them do a copy
           into FAST-RAM. This would save __MUCH__ time.

         - Silly mistake: A
           SetIoErr( 0L ); len = FRead( ..., requested ); sequence returns
           under various fs IoErr() == (-1L) or something else. The loader
           then aborts with this error code. (The code worked with RAM: disk,
           my VideoCD-fs ("white book" mode)) and AMICDROM, but wasn't tested
           with FFS or something else).
           The code now uses Read instead of FRead, checks for
           (len != requested), and only if TRUE IoErr() will be checked for
           any error.

         - Introduced BUFFER preferences option.

         - A CTRL-D signal send to the loading process now stops the load.
           This feature was implemented in V1.2, but I forgot to write it
           down here.

         - The autodoc now has a TOC (table of contents).

         - Support for Martin Apel's VMM (Virtual Memory Manager).
           (USEVMM switch in prefs file). The bitmaps can now be in virtual
           memory (the colormaps are traditional allocated by GetColorMap
           and cannot be in virtual memory (not yet nor in the future !)).
           The mpegvideo.datatype uses the vmm.library, this allows
           virtual memory usage even if the vmm.prefs disables virtual memory
           for all other tasks.
           NOTE: VMM is Shareware !!

       V1.4
         - vmm.library is now opened on demand (e.g. the USEVMM switch was
           set in the prefs file) inside the OM_NEW method.
           This fixes two problems:
           First: vmm.library was opened even it wasn't used.
           Second: OpenLibrary( "vmm.library", ... ) inside the LibInit
           function caused various problems.
           vmm.library will be closed by LibExpuge function.

         - Removed serial verbose output. Now, if the VERBOSE switch was set
           in the prefs file, all verbose output will be printed to
           "CON://///auto/wait/close/inactive".

         - Set the SC NOOPTIMIZERPEEPHOLE switch for mc68060 support:
           phase5 said that SAS/C 6.56 has a small bug in the peephole
           optimizer which may cause trouble with mc68060. The peephole
           optimizer will be turned on again if I know more details (and
           a workaround).

         - The product of LUM_RANGE * CR_RANGE * CB_RANGE was limited to
           a maximum of 512.  LUM_RANGE, CR_RANGE, CB_RANGE can now have
           any positive value up to 255. A value of 0 is treated as 1,
           fixing the problem of a possible division by zero.

         - Found a bug in COLOR dithering, which causes quality loss and
           color disorientation. Fixing this bug will take MUCH time.
           Not fixed yet.

         - To match the "DataTypes proposal", changes have been made:
           1. The location of the prefs file is now ENV:Classes/DataTypes/
              mpegvideo.prefs instead of ENV:DataTypes/mpegvideo.prefs
           2. Subclasses of mpegvideo.datatype are not supported. Any
              attempt to create a subclass object of mpegvideo.datatype
              will be rejected by mpegvideo.datatype.

         - Partial code cleanup. I've implemented partial support for
           output depths up to 16 bits. Currently, I'm limited to a maximum
           depth of 8 bitplanes (e.g. 256 colors) for two reasons:
           First, the system WritePixelArray8 function handles only byte
           width pen indexes, second, animation.datatype handles only a
           bitmaps up to 8 planes. Future releases of animation.datatype may
           handle deeper bitplanes. (Custom players like my DBufDTAnim which
           are using their own display code are able to display deeper
           bitmaps yet.)

         - Found out a little problem: When using VMM (swap file) with
           Enforcer, enforcer hits may block your system (occured on a
           A2000 Apollo 2030 mc68030 board).
           Who knows an answer for this problem ?

       V1.5
         Minor changes to support special compiled versions for 68020+,
         fpu etc.

         - Implemented the IGNOREERRORS switch, which attempts to ignore any
           error during loading.

         - Removed some dead code.

       V1.6
         The datatypes supports now scaling and sound. Sound was implemented
         for two reasons:
         1. For those streams which are distributed with a matching sound
            file.
         2. I'm reworking mpegsystem.datatype (which can play system streams,
            e.g. video with interleaved audio). The goal is to implement
            mpegsystem.datatype as a subclass of mpegvideo.datatype. The
            audio stream will be parsed using mpegaudio.datatype.
         Note that mpegvideo.datatype is still a GID_ANIMATION type datatype.
         The GID_#? idetifiers belongs to the source data, not the
         modifications done by a datatype code (a mpeg 1 video stream does
         not contain any audio information, the sound is attached later).

         - Implemented the WIDTH and HEIGHT options in the prefs file to
           support scaling.

         - Implemented SAMPLE and VOLUME options to support sound.

         - Now uses BestModeID for selecting the screen mode of the
           animation. The MODEID preference option overides this.
           The old behavior was to set the ADTA_ModeID attribute only if the
           MODEID prefs option was set, otherwise the default from
           animation.datatype was taken (which was everytimes 0).

         - Fixed the FPS preference option. If it was set, the value was got
           from the depth option instead using the given value.

         - Implemented a processing gauge as requested by Allan Odgaard
           (Duff@DK-Online.DK) and many other people. The matching
           NOPROGRESSGAUGE switch disables it. If the input filehandle is a
           pipe, the gauge may not work properly.

         - Implemented a lowermem limit (MINTOTALMEM option) for those
           people who wants to see at least the beginning of a big anim
           (idea by Allan Odgaard (Duff@DK-Online.DK)).

         - Implemented multi-line preferences, supports comments and
           per-project settings (MATCHPROJECT option). The old preference
           files/vars are compatible.

         - The stack size for the OM_NEW method is now checked. If the
           required size (curretly 12kb) isn't available, a requester will
           notify the user and the method returns an error.

       V1.7
         - Recompiled with SAS/C 6.57. Switched the peephole optimizer on
           (see V1.4 bugs).

         - Rewrote the DICECOLOR dithering/remapping code. The DICECOLOR
           color mode now creates a colormap per frame (animation.datatype
           40.7 does not support these colormap changes per frame (it's
           output looks like a color trash). Custom animation players which
           uses animation.datatype subclasses for loading (like my
           DBufDTAnim) don't have this problem. animation.datatype V41 will
           support these colormaps-per-frame.

           I changed the algorithm from a single-pass into a multi-pass
           operation, which allows the code to run on other output modes
           like ORDERED or FS (Floyd-Steinberg). A side-effect of this
           change is that options like COLORERROR and DICESKIP are selected
           automatically, which is more user-friendly.

           If you want to get the old DICECOLOR output, use
           DITHER=COLOR PALETTEPERFRAME options.

         - The mpegvideo.datatype uses 24 bit-colors internally and
           writes 32 bits per (r,b,g) gun. Now the high order bits of each
           color gun are replicated through the whole INT32.

         - Fixed a bug in the SAMPLE option, which caused possible crashes.

         - Fixed a bug in LibExpunge (didn't check lib_OpenCnt), which is
           also present in all my other external BOOSI classes (and
           datatypes).
           Thanks to Guenter Niki (gniki@informatik.uni-rostok.de) for
           reporting this bug.

         - Implemented the mpeg saving code (mpeg encoder). Currently,
           only mpeg-1 streams are written out.
           (Will be enabled in the public versions ONLY upon request;
           code is currently under construction).

         - Increased the stack requirements from 12kb up to 16kb, mainly
           to allow more recursive operations.

         - Implemented random access to frames (e.g you need not to load
           the whole animation, decoding is done on the fly).
           (Will be enabled in the public versions ONLY upon request;
           code is currently under construction,
           the matching LOADALL switch it set everytimes).

       V1.8
         - Added partial support for mpeg-2 (MPEG-2 does NOT work yet !),
           both encoder+decoder.

         - Added my own WritePixelArray8 replacement, which operates
           directly on the fast-mem bitmaps. This saves some internal
           copies, chipmem buffer for WPA8 etc.

         - Added my own scaling routine, replacing
           graphics.library/BitMapScale (which needs chipmem as temp.
           buffer).
           Does not work properly yet.

         - Fixed the gauge, which didn't work correctly with large streams
           (>= 8MB).
           Fixed.

         - The gauge ha now a text info, which shows the remaining time
           to decode.

         - Added experimental stack swapping code. The "Need more stack"-
           requester has been removed for this reason.

           This also fixes a possible deadlock of "input.device" because
           the GM_LAYOUT method was running with low stack.
           Fixed.

         - Color table setup now retries color table build with an increased
           COLORERROR if table (set by LUM_RANGE * CR_RANGE * CB_RANGE) does
           not fit. This allows any #?_RANGE value.

         - Fixed different problems within color setup. Now this should
           work with a higher quality, and a little bit faster.

         - Fixed the descriptor, which din't match all mpeg video streams.
           Fixed.

         - DTM_WRITE should return ERROR_NOT_IMPLEMENTED if DTWM_RAW mode is
           requested (becuase the encoder has been disabled, e.g. commented
           out). Now this is correctly done.
           Fixed.

         - The mc68060-Version now checks for the AFF_68060 (1L<<7) execbase
           flag instead using the AFF_68040.
           Fixed.

         - Added QUALITY prefs option and matching float-dct code.

       V1.9
         - Recompiled with SAS/C 6.58. Should fix some mc68060 related
           problems.

         - Minor and major housekeeping changes.

         - Added HAM code and HAM dither option as requested by many people.
           Thanks to Olaf Barthel for his fast HAM conversion code.

         - DTA_ObjName is now set (and equals to DTA_Name).

         - GM_LAYOUT/DTM_PROCLAYOUT code has been removed because
           animation.datatype class does the same.

         - Removed NOREMAP switch (and matching DTM_FRAMEBOX code) because
           this was an ugly hack. After all, it seems that MuliView 
           sets ADTA_Remap to FALSE on it's custom screens, and that
           using ADTA_Remap == FALSE on a screen which does not have the
           matching size may cause trouble.

         - ADTA_NumColors is now set to the number of used colors instead
           of 1UL << anim_depth. This saves some pens when allocating
           shared pens on shared screens.
           When palette-per-frames are used, the number of colors equals to
           1UL << anim_depth again.

         - Moved scaling code before dithering code. It now scales the lum,
           cr, cb data, which is more usefull when doing ordered or HAM
           dithering.

         - VMM support seems to be safe...

         - Changed the whole prefs-system. Now the defaults options are more
           usefull and are adapted correctly to some settings.

         - DITHER option now defaults to HAM, for those people who don't
           like to edit the prefs-file.

         - Added NOPALETTEPERFRAME/S, PFRAMES/S, BFRAMES/S, NOLOADALL/S,
           PROGRESSGAUGE/S, NOQUALITY/S switches to support multi-line
           prefs-files which uses the MATCHPROJECT feature.

         - Internal timing now uses animation.datatype V41
           ADTA_TicksPerFrame instead of ADTA_FramesPerSecond. This
           makes timing more precise.
           (ADTA_TicksPerFrame means 1200 / fps, based on realtime.library's
           timing model).

         - Increased the decoding the speed a little bit. But this may affect
           stability if someone feeds a corrupt mpeg file in the datatype.
           I try to fix the problem...

         - Now uses Peter McGavin's (p.mcgavin@irl.cri.nz) WritePixelArray8
           code (the C version).

         - Fixed the encoder stack problem.

         - The encoder now has no problems with dynamic frame delays (e.g.
           alf_Duration field in adtFrame).

         - The SKIP option now uses struct adtFrame -> alf_Duration instead
           of creating empty frames. This causes that the SKIPFRAMES option
           works only with animation.datatype V41.

         - Fixed the bug that the last sample might be too long, which
           caused unallocated memory reads (but only a few bytes) and small
           clicks at the end of the animation.

         - The startup-code has been rewritten, the code now gurantees that
           the order of OpenLibrary and CloseLibrary are correct and in a
           more usefull order.

         - Updated the autodoc a little bit.

       V1.10
         INTERNAL RELEASE

         - Large code cleanup.

         - If we reach the file end, we now add a end of sequence code
           manually to avoid any problems if we does not see the end code
           (this occurs in the NOLOADALL mode in the past...).

         - Removed all remaining parts of "recmpeg". Now I'm allowed to
           release the source :-)

         - Moved the encoder to the mpegvideo.datatype V2.

         - Moved the YUV -> 24-bit interleaved-planar to
           mpegvideo.datatype V2.

         - Removed the whole MPEG-2 support. mpegvideo.datatype V2 does this
           better.

         - Wrote a replacement for the 24 bit planar code (currently
           non-interleaved).

         - Rewrote the 24/15/16 bit dither code.
           Should fix some visual problems.

         - Fixed the bug that animation.datatype V41 wasn't detected
           correctly (the version check didn't match, therefore
           any V41 related features were not used).
           Fixed.

         - Added GAMMACORRECT and CHROMACORRECT options.

         - Removed BestModeIDA code because animation.datatype does the
           same job (better).

         - Fixed the bug that MODEID=0 turns the internal mode selection
           on instead of using LORES.
           This also requires a change in the prefs behaviour, the
           default value for the MODEID option is now "-1".
           Fixed.

         - Removed all internal accesses to ADTA_BitMapHeader because they
           are unneccesary (dead code).

         - The VERBOSE output is now turned on if a serious error occurs.

         - If frames are skipped (using the NOPFRAMES or NOBFRAMES option)
           now the duration of the last frame is increased to get sync
           with the stream time.

         - Fixed the bug that the total number of frames might be incorrect
           in rare cases.
           Fixed.

         - Fixed a bug in the color setup of ORDERED dithering which
           caused that the values runned from 0 upto 256 (256 == 0 in an
           UBYTE). Now the color values are correctly running from 0-255.
           Fixed.

           Fixed the same bug in GRAY dither setup.
           Fixed.

       V1.11
         - Enabled the NOLOADALL mode for the public.

         - Small code cleanup to remove some unneccesary parts of code
           (mainly the obsolete encoder support).

         - Fixed the bug that the depth of a CyberGFX ARGB bitmap must be 32
           instead of 24.
           Fixed.

         - Added some safety in CyberGFX LockBitMap handling (which has a bug
           in tag parsing).

         - Added workaround for NOLOADALL mode that ADTM_LOADFRAME returns
           1UL instead of NULL if it forgets a frame (to avoid that the
           playback stops...).
           Not nice...

         - Fixed a bug in 24bit -> HAM dithering introduced in V1.10.
           Fixed.

         - Replaced stack swapping code by a "standard module".

         - Increased the "default" buffer size from 4096 up to 16384.
           This makes the gauge less accurate for small streams, but
           gives a small speedup when parsing large streams.

   SEE ALSO
       animation.datatype,
       mpegsystem.datatype, mpegvideo.datatype
       picmovie.datatype,
       paranimdtcpatch

----

Bye,
Roland