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