#ifndef DEVICES_PEGGYMPEG_H
#define DEVICES_PEGGYMPEG_H

/*
**	$VER: peggympeg.h 5.4 (11.06.94)
**
**	peggympeg.device include file
**
**	(C) Copyright 1993-94 Ing. Buero Helfrich
**      by Alexander Pratsch
**	    All Rights Reserved
**
*/

#ifndef EXEC_IO_H
#include "exec/io.h"
#endif /* EXEC_IO_H */

struct IOMPEGReq
{
	/* Standard Stuff */
	struct IOStdReq	iomr_Req;

	/* Global MPEG fields */
	UWORD		iomr_MPEGError;		/* Extended Error Information */
	UBYTE		iomr_Version;		/* Must be set to 0 for this spec */
	UBYTE		iomr_StreamType;
	ULONG		iomr_MPEGFlags;
	LONG		iomr_Arg1;
	ULONG		iomr_Arg2;

	UWORD		iomr_PTSHigh;		/* Bits 32-30 of this data's PTS */
	UWORD		iomr_PTSMid;		/* Bits 29-15 of this data's PTS */
	UWORD		iomr_PTSLow;		/* Bits 14-9  of this data's PTS */

	/* Private Device Information */
	UWORD		iomr_Private0;
	ULONG		iomr_Private1;
	ULONG		iomr_Private2;

	UWORD		iomr_Private3;
	UWORD		iomr_Private4;
	UWORD		iomr_Private5;
};

/*
** Handy defines
**
*/

// number of loops only valid for MPEGF_REPEAT, 0 infinite
#define iomr_Loops				iomr_PTSHigh
#define	iomr_SlowSpeed		iomr_Arg1
#define iomr_PauseMode		iomr_Arg1
#define iomr_DisplayType	iomr_Arg1
#define iomr_SearchSpeed	iomr_Arg1
#define iomr_SectorSize		iomr_Arg1
#define iomr_StreamStart	iomr_Arg2

/* extended peggympeg defines */
#define AMIGA_AUDIO 0
#define MPEG_AUDIO 1

#define PAL_RATE 3																			/* playback rates */
#define NTSC_RATE 4

#define YCbCr_MODE 0																		/* color output modes */
#define RGB_MODE 1

/*
** Defined Stream Types
*/
#define	MPEGSTREAM_VIDEO	1	/* Raw Video bitstream */
#define MPEGSTREAM_AUDIO	2	/* Raw Audio bitstream */
#define MPEGSTREAM_SYSTEM	3	/* ISO 1172 System Stream */

/*
** Extended Peggy Stream Types
*/
#define MPEGSTREAM_UNKNOWN 0	/* returned by GetStreamInfo in case of an error */

/*
** MPEG Error Values
*/
#define MPEGERR_BAD_STATE	1	/* Command is illegal for the current device state */
#define MPEGERR_BAD_PARAMETER	2	/* Some parameter was illegal */
#define MPEGERR_CMD_FAILED	3	/* Command Failed */
#define MPEGERR_CDERROR		4	/* Problem with cd.device I/O */
#define MPEGERR_CDXAERROR	5	/* selected drive is not Video CD compatible */
/*
** Extended error values.
*/
#define MPEGEXTERR_STREAM_MISMATCH	1	/* Stream type not appropriate */
#define MPEGEXTERR_MICROCODE_FAILURE	2	/* MicroCode failed to respond */
#define MPEGEXTERR_BAD_STREAM_TYPE	3	/* Stream/Command incompatible */

/*
** Flags for iomr_MPEGFlags
*/

#define MPEGB_VALID_PTS			31	/* This bit of data has a valid PTS */
#define MPEGB_ONESHOT			2	/* One-Shot scan */
#define MPEGB_PAUSEATEND 10		/* pause if finished playfile, playlsn do not stop */
#define MPEGB_REPEAT	11			/* repeat at end (may be set while command is allready pending) */

#define MPEGF_VALID_PTS			(1L << MPEGB_VALID_PTS)
#define MPEGF_ONESHOT			(1L << MPEGB_ONESHOT)
#define MPEGF_PAUSEATEND		(1L << MPEGB_PAUSEATEND)
#define MPEGF_REPEAT			(1L << MPEGB_REPEAT)

/*
** MPEG Device Commands
*/
#define MPEGCMD_PLAY		(CMD_NONSTD + 0)
#define MPEGCMD_PAUSE		(CMD_NONSTD + 1)
#define MPEGCMD_SLOWMOTION	(CMD_NONSTD + 2)
#define MPEGCMD_SINGLESTEP	(CMD_NONSTD + 3)
#define MPEGCMD_SEARCH		(CMD_NONSTD + 4)
#define MPEGCMD_RECORD		(CMD_NONSTD + 5)
#define MPEGCMD_GETDEVINFO	(CMD_NONSTD + 6)
#define MPEGCMD_SETWINDOW	(CMD_NONSTD + 7)
#define MPEGCMD_SETBORDER	(CMD_NONSTD + 8)
#define MPEGCMD_GETVIDEOPARAMS	(CMD_NONSTD + 9)
#define MPEGCMD_SETVIDEOPARAMS	(CMD_NONSTD + 10)
#define MPEGCMD_SETAUDIOPARAMS	(CMD_NONSTD + 11)
#define MPEGCMD_PLAYLSN		(CMD_NONSTD + 12)
#define MPEGCMD_SEEKLSN		(CMD_NONSTD + 13)
#define MPEGCMD_READFRAMEYUV	(CMD_NONSTD + 14)

/*
** PEGGYMPEG Extended Device Commands
*/
#define MPEGCMD_PLAYFILE	(CMD_NONSTD + 15)
#define MPEGCMD_GETSMPTE	(CMD_NONSTD + 16)
#define MPEGCMD_GETCDCONTENTS	(CMD_NONSTD + 17)

#define MPEGCMD_END		(CMD_NONSTD + 18)

/*
** This structure is returned form a MPEGCMD_GETDEVINFO command. Use this
** to determine what the device driver is capable of doing.  Not all devices
** will support all commands/features.
*/

struct MPEGDevInfo
{
	UWORD	mdi_Version;
	UWORD	mdi_Flags;
	ULONG	mdi_BoardCapabilities;
	UBYTE	mdi_BoardDesc[256];
};

struct MPEGVideoParams
{
	UWORD	mvp_Version;		/* Version of this structure */
	UWORD	mvp_Flags;		/* For future use */
	UWORD	mvp_PictureWidth;	/* Width in SIF (Amiga Lo-res) pixels (read-only) */
	UWORD	mvp_PictureHeight;	/* Height in non-interlaced scanlines (read-only) */

};

struct MPEGWindowParams
{
	UWORD	mwp_XOffset;		/* Hi-Res Pixels */
	UWORD	mwp_YOffset;		/* Non-interlaced scanlines */
	UWORD	mwp_Width;		/* Hi-Res Pixels */
	UWORD	mwp_Height;		/* Non-interlaced scanlines */
};

struct MPEGBorderParams
{
	UWORD	mbp_BorderLeft;		/* Hi-Res Pixels or zero for autocenter */
	UWORD	mbp_BorderTop;		/* Non-interlaced scanlines or zero for autocenter */
	UBYTE	mbp_BorderRed;		/* Border 8-bit red value */
	UBYTE	mbp_BorderGreen;	/* Border 8-bit green value */
	UBYTE mbp_BorderBlue;		/* Border 8-bit blue value */
};

/* The structure is used by the MPEGCMD_READFRAMEYUV command. */
/* Color components with NULL pointers will not be written to. */

struct MPEGFrameStore
{
	UWORD	mfs_Width;		/* Picture Width */
	UWORD	mfs_Height;		/* Picture Height */
	UBYTE	*mfs_Luma;		/* Must be Width*Height bytes */
	UBYTE	*mfs_Cr;		/* Must be Width*Height/4 bytes */
	UBYTE	*mfs_Cb;		/* Must be Width*Height/4 bytes */
};

/*
** NB: Not all devices support the full functionality that these
**     structures provide for.  Please take this into account.
*/

struct MPEGVideoParamsSet
{
	UWORD	mvp_Fade;					/* Fade level. (for peggy: 0 = no MPEG video at all, 1-65534 MPEG in background,
													 * 65535 = full saturation) */
	UWORD	mvp_DisplayType;	/* 3 = PAL (50Hz), 4 = NTSC (60Hz) */
	UWORD mvp_GenlockMode;	/* extended peggy genlock mode:
													 *	Bit	ECS		AGA
													 *		0 R3		R7			for example 0x7 means that colour 0x888 (ECS) or 0x808080 (AGA) is
													 *		1 G3    G7			genlocked
													 *		2 B3    B7
													 *		3 B0    B4
													 *	 15 activate color key mode (bits 0-3 carry the genlock color)
													 */
	UWORD mvp_ColorMode;		/* extended peggy color output mode */
	UWORD mvp_VideoOutput;	/* 0=off, 1=on: switches Peggy Video Converter */
};

struct MPEGVideoParamsGet
{
	UWORD	mvp_PictureWidth;	/* Width in lo-res pixels */
	UWORD	mvp_PictureHeight;	/* Width in non-interlaced scanlines */
	UWORD	mvp_PictureRate;	/* Pictures per second */
};

struct MPEGAudioParams
{
	/* only mute or loudest are supported for
	 * the current release of the peggympeg.device
	 */
	UWORD	map_VolumeLeft;		/* Left Channel Volume (0=Mute, 65535 = loudest) */
	UWORD	map_VolumeRight;	/* Right Channel Volume */

	UWORD	map_StreamID;		/* MPEG Audio stream ID. ~0 for all streams */
	UWORD map_AudioMode;	/* extended peggy audio mode (e.g. AMIGA/PEGGY audio) */
};

/* extende peggy command set structures */
struct MPEGSMPTE {
	UWORD mtc_Hours;
	UWORD mtc_Minutes;
	UWORD mtc_Seconds;
	UWORD mtc_Frames;
};

/* Board Capabilities for playback */

#define MPEGCB_PLAYRAWVIDEO	16
#define MPEGCB_PLAYRAWAUDIO	17
#define MPEGCB_PLAYSYSTEM	18
#define MPEGCB_WINDOWVIDEO	19
#define MPEGCB_SCALEVIDEO	20
#define MPEGCB_STEPPLAY		21
#define MPEGCB_SCANPLAY		22

/* Flag Versions */

#define MPEGCF_PLAYRAWVIDEO	(1L << MPEGCB_PLAYRAWVIDEO)
#define MPEGCF_PLAYRAWAUDIO	(1L << MPEGCB_PLAYRAWAUDIO)
#define MPEGCF_PLAYSYSTEM	(1L << MPEGCB_PLAYSYSTEM)
#define MPEGCF_WINDOWVIDEO	(1L << MPEGCB_WINDOWVIDEO)
#define MPEGCF_SCALEVIDEO	(1L << MPEGCB_SCALEVIDEO)
#define MPEGCF_STEPPLAY		(1L << MPEGCB_STEPPLAY)
#define MPEGCF_SCANPLAY		(1L << MPEGCB_SCANPLAY)

/*
** extended peggy library command structures and defines
*/

/* possible aspects */

#define MPEG_ASPECT_1_0			1
#define MPEG_ASPECT_0_6735	2
#define MPEG_ASPECT_0_7031	3
#define MPEG_ASPECT_0_7615	4
#define MPEG_ASPECT_0_8055	5
#define MPEG_ASPECT_0_8437	6
#define MPEG_ASPECT_0_8935	7
#define MPEG_ASPECT_0_9157	8
#define MPEG_ASPECT_0_9815	9
#define MPEG_ASPECT_1_0255	10
#define MPEG_ASPECT_1_0695	11
#define MPEG_ASPECT_1_0950	12
#define MPEG_ASPECT_1_1575	13
#define MPEG_ASPECT_1_2015	14

#define MPEG_ASPECT_PAL			MPEG_ASPECT_0_9157
#define MPEG_ASPECT_NTSC		MPEG_ASPECT_1_0950

/* possible pictures rates */

#define MPEG_RATE_23_976		1
#define MPEG_RATE_24				2	
#define MPEG_RATE_25				3	
#define MPEG_RATE_29_97			4
#define MPEG_RATE_30				5	
#define MPEG_RATE_50				6	
#define MPEG_RATE_59_94			7
#define MPEG_RATE_60				8	

#define MPEG_RATE_AUTO			MPEG_RATE_24		/* may be correctly displayed on PAL and NTSC systems */
#define MPEG_RATE_PAL				MPEG_RATE_25	
#define MPEG_RATE_NTSC			MPEG_RATE_30

/* audio information */
#define MPEGAUD_LAYER_UNKNOWN 0
#define MPEGAUD_LAYER_I 3
#define MPEGAUD_LAYER_II 2
#define MPEGAUD_LAYER_III 1

#define MPEGAUD_FREQ_44.1_khz 0
#define MPEGAUD_FREQ_48_khz 1
#define MPEGAUD_FREQ_32_khz 2

#define MPEGAUD_COPY 0
#define MPEGAUD_ORIGINAL 1

#define MPEGAUD_NO_COPYRIGHT 0
#define MPEGAUD_COPYRIGHT 1

/* mode masks */ 
#define MPEGAUD_MODE (3<<2)
#define MPEGAUD_EXTMODE (3)

/* mode */
#define MPEGAUD_STEREO (0<<2)
#define MPEGAUD_JOINT_STEREO (1<<2)
#define MPEGAUD_DUAL_CHANNEL (2<<2)
#define MPEGAUD_SINGLE_CHANNEL (3<<2)

/* ext. mode in Layer I or II */
#define MPEGAUD_SUBBANDS_4_31 0
#define MPEGAUD_SUBBANDS_8_31 1
#define MPEGAUD_SUBBANDS_12_31 2
#define MPEGAUD_SUBBANDS_16_31 3

/* ext. mode in Layer III */
#define MPEGAUD_INTENSITY_STEREO 1
#define MPEGAUD_MS_STEREO 2

#define MPEGAUD_EMPHASIS_NONE 0
#define MPEGAUD_EMPHASIS_50_15MS 1
#define MPEGAUD_EMPHASIS_CCITT_J17 3

struct MPEGStreamInfo {
	UWORD StreamType;
	UWORD Width,Height;
	ULONG BitRate;								/* bits per second for video data */
	ULONG MinBuffer;							/* minimal buffer size (in bytes) */
	ULONG AudioBitRate;						/* bits per second for audio data */
	UBYTE AspectRatio;						/* aspect ratio code */
	UBYTE PictureRate;						/* picture rate code */

	UBYTE AudioLayer;							// only available for MPEGSTREAM_AUDIO
	UBYTE AudioFreq;
	UBYTE AudioMode;
	UBYTE AudioCopyright;
	UBYTE AudioHome;
	UBYTE AudioEmphasis;
};

/*
** MPEGEnvironment - tells the device there to get its data from
*/
struct MPEGEnvironment {
	UWORD met_Length;					/* in the case this structure enhances */
	char *met_Device;					/* the name of the scsi device */
	UWORD met_DevUnit;					/* the unit number to use */
	ULONG met_DevFlags;					/* flags to open device with */
	UWORD met_DevType;					/* the device type e.g. CD-ROM, CDXA, Harddisk, Tape */
};

/* MPEGDEV_TYPES */
#define MPEGDEV_CDXA 1			/* support for philipsŪ video cd */
#define MPEGDEV_CDROM 2			/* future support for direct cd replay */
#define MPEGDEV_HD 3				/* future support for direct hd replay */
#define MPEGDEV_TAPE 4			/* future support for tape drivers (DAT as VCR?) */

/*
** MPEGCDInfo - structure to be filled with information from VideoCDs
** You may give an area of these structures as parameter to GETCDCONTENTS.
** The first structure contains the name of the CD, the first MPEG Block
** and the total amount of blocks on the CD.
*/
#define TRACKTYPE_DATA 1
#define TRACKTYPE_AUDIO 2
#define TRACKTYPE_MPEG 3
#define TRACKTYPE_WHITEMPEG 4		// this is a white book track it contains non-mpeg data, so never play more than
																// one track at once, play them track after track, with the given start and length
																// values.

struct MPEGCDInfo {
	UBYTE mcd_Name[384];		/* CD title 64 byte CD comment 320 byte or track title 32 byte */
	ULONG mcd_StartBlock;
	ULONG mcd_Length;				/* NULL for last entry */
	UWORD mcd_TrackNumber;	/* not guranteed to be accurate */
	UWORD mcd_TrackType;
};

#endif /* DEVICES_PEGGYMPEG_H */
