CHANGES TO MCIAVI FOR 1.X:

    "other" streams are handled correctly, rectangle's will be
    mapped correctly and draw handlers will be called.

    draw handlers:

        DIB draw handler, there can now be a draw device for uncomressed
        frames, for example hardware can stretch frames, but does not
        need to decomptress.

        the full screen draw handler (DIB draw handler...) can be replaced.

        custom draw handlers can be installed per stream. (a app can
        override the default).  This is done with a new MCI command
        to set the draw procedure.

    formats:

        32 bit DIBs are supported, a decompressor can decompress to
        a 32 bit DIB if wants to.

    decompression to special DIB formats:

        upside down DIB

        MCIAVI will ask the decompressor in decompress to a "upside down"
        DIB.  a "upside down" is a DIB with the scans stored in memory
        top scan to bottom scan, (normal DIBs are stored bottom to top)

        a "upside down" DIB will have a negative biHeight, the height
        of the DIB is abs(biHeight).  the bits pointer passed points
        to the top scan, ie the first one.

        special DIB formats:

        to handle decompression to internal bitmaps in memory, a "new"
        DIB format is used, when biCompression == 'BITM' the DIB memory
        is in HUGE BITMAP format:

            biCompression       'BITM'
            biHeight            will be <0 for a top to bottom bitmap.
            biXPelsPerMeter     will be the width bytes of the bitmap.
            biYPelsPerMeter     will be the fill bytes of the bitmap.


    key frame info:

    a new structure is passed to ICM_DECOMPRESS:

        struct {
            DWORD               dwFlags;    // flags (from AVI index...)
            LPBITMAPINFOHEADER  lpbiInput;  // BITMAPINFO of compressed data
            LPVOID              lpInput;    // compressed data
            LPBITMAPINFOHEADER  lpbiOutput; // DIB to decompress to
            LPVOID              lpOutput;
            DWORD               ckid;       // ckid from AVI file
            int                 iFrame;     // frame info.
            int                 iNextKey;
            int                 iPrevKey;
        }   ICDECOMPRESSX;

    NOTE before using any of the extra info in this structure the
    deompressor should check the size field.

    example:

    case ICM_DECOMPRESS:

        //
        // make sure we have a ICDECOMPRESSX structure
        //
        if ((DWORD)lParam2 >= sizeof(ICDEOMPRESSX))
            return DecompressX(pi,
                 (ICDECOMPRESSX FAR *)lParam1, (DWORD)lParam2);
        else
            return Decompress(pi,
                 (ICDECOMPRESS FAR *)lParam1, (DWORD)lParam2);

    NEW MESSAGE ICM_SET

        #define ICM_SET (ICM_RESERVED+40)
        #define ICM_FRAMERATE       mmioFOURCC('F','r','m','R')
        #define ICM_KEYFRAMERATE    mmioFOURCC('K','e','y','R')

        before playing starts two params get sent down to the decompressor:

            ICM_SET
                lParam1 = 'FrmR'                    (set the frame rate)
                lParam2 = microseconds per frame

            ICM_SET
                lParam1 = 'KeyR'                    (set the key frame "rate")
                lParam2 = average key frame rate    (ie key frame every 15)

        NOTE the key frame rate is a average.


TO DO:
    named streams.
    multiple video streams.
    linked streams (data in another file...)
