/*
 *--------------------------------------------------------------
 *
 * cybergraphx/cgxmpeg.h
 *
 *      main include file for cgxmpeg.library
 *
 *      (c) 1997 by phase5 digital products
 *
 *--------------------------------------------------------------
 */

#ifndef CYBERGRAPHX_CGXMPEG_H
#define CYBERGRAPHX_CGXMPEG_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

#ifndef UTILITY_TAGITEM_H
#include <utility/tagitem.h>
#endif

#define CGXMPEG_HANDLER         (TAG_USER + 0x02306000)

/*
 * I/O Handler Tags
 */
#define MPGIOHANDLER_TYPE       (CGXMPEG_HANDLER + 0)   /* see MPGIOTYPE_* */
#define MPGIOHANDLER_OPEN       (CGXMPEG_HANDLER + 1)   /* Open function of I/O handler */
#define MPGIOHANDLER_CLOSE      (CGXMPEG_HANDLER + 2)   /* Close function of I/O handler */
#define MPGIOHANDLER_PERFORM    (CGXMPEG_HANDLER + 3)   /* Perform function of I/O handler */
#define MPGIOHANDLER_EXTRA      (CGXMPEG_HANDLER + 4)   /* Extra function (eg. Seek, Resize, Mute) */

/*
 * CreateMPGHandle Tags
 */
#define CGXMPEG_CREATE          (CGXMPEG_HANDLER + 0x00001000)
#define MPGCREATE_RANDOM        (CGXMPEG_CREATE + 0)    /* Random stream access possible (boolean) */
#define MPGCREATE_PRESCAN       (CGXMPEG_CREATE + 1)    /* Prescan stream and create index file (boolean) */
#define MPGCREATE_VIDEO_ACCESS  (CGXMPEG_CREATE + 2)    /* Open for video access (boolean) */
#define MPGCREATE_AUDIO_ACCESS  (CGXMPEG_CREATE + 3)    /* Open for audio access (boolean) */
#define MPGCREATE_IGNORE_ERRORS (CGXMPEG_CREATE + 4)    /* Ignore errors in MPEG stream (boolean) */
#define MPGCREATE_FRAMERATE     (CGXMPEG_CREATE + 5)    /* Frame rate in fps
                                                            0 = as defined in stream
                                                           -1 = as fast as possible */
#define MPGCREATE_LOOP          (CGXMPEG_CREATE + 6)    /* Loop flag (boolean) */
#define MPGCREATE_NO_B          (CGXMPEG_CREATE + 7)    /* Show no B pictures (boolean) */
#define MPGCREATE_NO_P          (CGXMPEG_CREATE + 8)    /* Show no P pictures (boolean) */

/*
 * I/O Handler Type
 */
#define CGXMPEG_IOTYPE          0x00003000
#define MPGIOTYPE_INPUT         (CGXMPEG_IOTYPE + 0)    /* Input eg. File, RAM */
#define MPGIOTYPE_VIDEO         (CGXMPEG_IOTYPE + 1)    /* Video output */
#define MPGIOTYPE_AUDIO         (CGXMPEG_IOTYPE + 2)    /* Audio output */
#define MPGIOTYPE_IDCT          (CGXMPEG_IOTYPE + 3)    /* IDCT input/output */

/*
 * Action Types
 */
#define CGXMPEG_ACTION          (CGXMPEG_IOTYPE + 0x00001000)
#define MPGACTION_PLAY          (CGXMPEG_ACTION + 0)    /* Play */
#define MPGACTION_PAUSE         (CGXMPEG_ACTION + 1)    /* Pause */
#define MPGACTION_FFWD          (CGXMPEG_ACTION + 2)    /* Fast Forward */
#define MPGACTION_REW           (CGXMPEG_ACTION + 3)    /* Rewind */
#define MPGACTION_SLOWFWD       (CGXMPEG_ACTION + 4)    /* Slow motion forward */
#define MPGACTION_SLOWREW       (CGXMPEG_ACTION + 5)    /* Slow motion rewind */
#define MPGACTION_REFRESH       (CGXMPEG_ACTION + 20)   /* Refresh display (causes PerformVideo call) */
#define MPGACTION_NEWSIZE       (CGXMPEG_ACTION + 21)   /* New display size (causes ExtraVideo call) */
#define MPGACTION_EJECT         (CGXMPEG_ACTION + 99)   /* Eject */
#define MPGACTION_QUIT          MPGACTION_EJECT         /* Quit = Eject */

/*
 * State Types
 */
#define CGXMPEG_STATE           (CGXMPEG_IOTYPE + 0x00002000)
#define MPGSTATE_PLAY           (CGXMPEG_STATE + 0)     /* Playing */
#define MPGSTATE_PAUSE          (CGXMPEG_STATE + 1)     /* Pausing */
#define MPGSTATE_UNDEFINED      (CGXMPEG_STATE + 40)    /* Undefined */
#define MPGSTATE_EJECT          (CGXMPEG_STATE + 99)    /* Ejecting */
#define MPGSTATE_QUIT           MPGSTATE_EJECT          /* Quit = Eject */

/*
 * Error Codes
 */
#define CGXMPEG_ERROR           0xD0570000
#define MPGERR_OK               0                               /* Everything okay */

#define MPGERR_EOF              (CGXMPEG_ERROR + 1)             /* End of file */
#define MPGERR_OPEN             (CGXMPEG_ERROR + 2)             /* Error while opening file */
#define MPGERR_NOMPEG           (CGXMPEG_ERROR + 3)             /* Not an MPEG file */

#define CGXMPEG_VIDEO_ERROR     (CGXMPEG_ERROR + 0x00001000)
#define MPGERR_VIDMEM           (CGXMPEG_VIDEO_ERROR + 0)       /* No memory for video */
#define MPGERR_VIDOPEN          (CGXMPEG_VIDEO_ERROR + 1)       /* Could not open video display */
#define MPGERR_VIDPERFORM       (CGXMPEG_VIDEO_ERROR + 2)       /* Could not perform video display */

#define CGXMPEG_AUDIO_ERROR     (CGXMPEG_ERROR + 0x00002000)
#define MPGERR_AUDMEM           (CGXMPEG_VIDEO_ERROR + 0)       /* No memory for audio */


/*
 * MPGTimeStamp
 */
struct MPGTimeStamp {
        ULONG                   mpgts_hours;                    /* Hours [0-23] */
        ULONG                   mpgts_minutes;                  /* Minutes [0-59] */
        ULONG                   mpgts_seconds;                  /* Seconds [0-59] */
        ULONG                   mpgts_pictures;                 /* Pictures [0-59] */
};

/*
 * MPGVideoFrame
 */
struct MPGVideoFrame {
        ULONG                   mpgvf_width;                    /* Frame width */
        ULONG                   mpgvf_height;                   /* Frame height */
        UBYTE                   *mpgvf_y_data;                  /* Y data */
        UBYTE                   *mpgvf_u_data;                  /* U data */
        UBYTE                   *mpgvf_v_data;                  /* V data */
        ULONG                   mpgvf_number;                   /* Current frame number */
        struct MPGTimeStamp     mpgvf_time;                     /* Timestamp */
};

/*
 * MPGAudioFrame
 */
struct MPGAudioFrame {
        ULONG                   mpgaf_frequency;                /* Frequency in Hertz (Hz) */
        ULONG                   mpgaf_size;                     /* Frame size in bytes */
        UWORD                   *mpgaf_data;                    /* 16bit audio data */
        struct MPGTimeStamp     mpgaf_time;                     /* Timestamp */
};

#endif

